WPF-动态加载

  1. 添加一个UserControl,命名为BusyIndicator,view为空,在其.cs文件中定义一个类

    1         /// <summary>
    2         /// 动态实体
    3         /// </summary>
    4        public class AnimationObject
    5        {
    6            public DoubleAnimation DoubleAnimation { get; set; }
    7
    8            public TranslateTransform TranslateTransform { get; set; }
    9        }
  2. 定义属性
    1.  1    #region Properties
       2
       3         /// <summary>
       4         /// 系统是否后台运行
       5         /// </summary>
       6         public bool IsBusy
       7         {
       8             get
       9             {
      10                 return (bool)GetValue(IsBusyProperty);
      11             }
      12             set
      13             {
      14                 SetValue(IsBusyProperty, value);
      15                 IsWorking = value;
      16                 if (value)
      17                 {
      18                     BeginAnimation();
      19                     //显示
      20                     base.Visibility = System.Windows.Visibility.Visible;
      21                 }
      22                 else
      23                 {
      24                     //隐藏
      25                     base.Visibility = System.Windows.Visibility.Collapsed;
      26                 }
      27             }
      28         }
      29
      30         /// <summary>
      31         /// 是否在运行
      32         /// </summary>
      33         private bool IsWorking { get; set; }
      34
      35         /// <summary>
      36         /// 圆点的宽
      37         /// </summary>
      38         public new double? Width { get; set; }
      39
      40         /// <summary>
      41         /// 圆点的高
      42         /// </summary>
      43         public new double? Height { get; set; }
      44
      45         /// <summary>
      46         /// 圆点移动的间隔时间,秒
      47         /// </summary>
      48         public double? WaitTimeSpan { get; set; }
      49
      50         /// <summary>
      51         /// 圆点的数量
      52         /// </summary>
      53         public int? EllipseCount { get; set; }
      54
      55         /// <summary>
      56         ///
      57         /// </summary>
      58         public List<AnimationObject> Ellipses { get; set; }
      59
      60         /// <summary>
      61         /// 填充画刷
      62         /// </summary>
      63         public Brush Fill { get; set; }
      64
      65         /// <summary>
      66         /// 轮廓画刷
      67         /// </summary>
      68         public Brush Stroke { get; set; }
      69
      70         /// <summary>
      71         /// 圆点的间隔
      72         /// </summary>
      73         public int? Space { get; set; }
      74
      75         /// <summary>
      76         /// 圆点的播放时长
      77         /// </summary>
      78         public double? Duration { get; set; }
      79
      80         #endregion

  3. 添加事件
    1.   1  #region Methods
        2
        3
        4
        5         /// <summary>
        6         /// 加载完毕事件
        7         /// </summary>
        8         /// <param name="sender"></param>
        9         /// <param name="e"></param>
       10         private void WinViewLoaded(object sender, RoutedEventArgs e)
       11         {
       12             InitializateData();
       13         }
       14
       15         /// <summary>
       16         /// 初始化数据
       17         /// </summary>
       18         private void InitializateData()
       19         {
       20             if (!Width.HasValue)
       21             {
       22                 Width = 10;
       23             }
       24             if (!Height.HasValue)
       25             {
       26                 Height = 10;
       27             }
       28             if (!EllipseCount.HasValue)
       29             {
       30                 EllipseCount = 10;
       31             }
       32             if (!WaitTimeSpan.HasValue)
       33             {
       34                 WaitTimeSpan = 0.3;
       35             }
       36             if (!Space.HasValue)
       37             {
       38                 Space = 10;
       39             }
       40             if (!this.Duration.HasValue)
       41             {
       42                 this.Duration = 0.5;
       43             }
       44
       45             Ellipses = new List<AnimationObject>();
       46             TopGrid.Children.Clear();
       47             for (int i = 0; i < EllipseCount; i++)
       48             {
       49                 Ellipses.Add(SetEllipse(i));
       50             }
       51         }
       52
       53         /// <summary>
       54         /// 设置圆点
       55         /// </summary>
       56         /// <param name="_index"></param>
       57         /// <returns></returns>
       58         private AnimationObject SetEllipse(int _index)
       59         {
       60             //绘制一个椭圆
       61             Ellipse e = new Ellipse();
       62
       63             e.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
       64             e.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
       65             e.Width = Width.Value;
       66             e.Height = Height.Value;
       67             e.Fill = Fill;
       68             e.Stroke = Stroke;
       69             e.StrokeThickness = 2;
       70             TransformGroup tg = new TransformGroup();
       71             e.RenderTransform = tg;
       72             TranslateTransform tt = new TranslateTransform();
       73             tg.Children.Add(tt);
       74             DoubleAnimation da = new DoubleAnimation();
       75             da.Name = "DA" + _index.ToString();
       76             da.From = 0;
       77             da.To = TopGrid.ActualWidth / 2 + (EllipseCount * Space) / 2 - _index * Space;
       78             da.Duration = new Duration(TimeSpan.FromSeconds(this.Duration.Value));
       79             da.BeginTime = TimeSpan.FromSeconds(_index * WaitTimeSpan.Value);
       80             da.Completed += (s, x) =>
       81             {
       82                 DoubleAnimation thisDa = (s as AnimationClock).Timeline as DoubleAnimation;
       83                 int DaIndex = int.Parse(thisDa.Name.Replace("DA", ""));
       84                 DoubleAnimation da2 = new DoubleAnimation();
       85                 da2.From = thisDa.To;
       86                 da2.BeginTime = thisDa.BeginTime.Value.Add(TimeSpan.FromSeconds((EllipseCount.Value - 1) * WaitTimeSpan.Value - DaIndex * WaitTimeSpan.Value));
       87                 da2.To = TopGrid.ActualWidth + Space * EllipseCount - Space - DaIndex * Space;
       88                 da2.Duration = new Duration(TimeSpan.FromSeconds(this.Duration.Value));
       89                 if (_index == EllipseCount - 1) //最后一个点二阶段的动画都已结束
       90                 {
       91                     da2.Completed += (ss, ee) =>
       92                     {
       93                         if (IsBusy) BeginAnimation();
       94                         else IsWorking = false;
       95                     };
       96                 }
       97                 tt.BeginAnimation(TranslateTransform.XProperty, da2);
       98             };
       99             TopGrid.Children.Add(e);
      100
      101             return new AnimationObject() { DoubleAnimation = da,TranslateTransform = tt };
      102         }
      103
      104         /// <summary>
      105         /// 开始变动
      106         /// </summary>
      107         private void BeginAnimation()
      108         {
      109             IsWorking = true;
      110             foreach (var ell in Ellipses)
      111             {
      112                 ell.TranslateTransform.BeginAnimation(TranslateTransform.XProperty, ell.DoubleAnimation);
      113             }
      114         }
      115
      116         #endregion

  4. 最后运行
  5.  1  /// <summary>
     2         ///
     3         /// </summary>
     4         public BusyIndicator()
     5         {
     6             InitializeComponent();
     7
     8             Fill = new SolidColorBrush(Colors.DarkBlue);
     9             Stroke = new SolidColorBrush(Colors.White);
    10             InitializateData();
    11             this.Loaded += WinViewLoaded;
    12         }
    13
    14
    15         public static DependencyProperty IsBusyProperty =
    16             DependencyProperty.RegisterAttached("IsBusy",
    17                             typeof(bool),
    18                             typeof(BusyIndicator),
    19                             new FrameworkPropertyMetadata((bool)false, IsBusyChanged));
    20
    21         /// <summary>
    22         /// 是否后台运行的变化事件
    23         /// </summary>
    24         /// <param name="sender"></param>
    25         /// <param name="e"></param>
    26         private static void IsBusyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    27         {
    28             BusyIndicator waiting = sender as BusyIndicator;
    29             if (waiting == null)
    30             {
    31                 return;
    32             }
    33             else
    34             {
    35                 waiting.IsBusy = (bool)e.NewValue;
    36             }
    37         }

时间: 2024-10-12 01:28:27

WPF-动态加载的相关文章

WPF动态加载3D&nbsp;放大-旋转-平移

原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs 第二步:ModelVisual3DWithName.cs public class ModelVisual3DWithName:ModelVisual3D { public string Name { get; set; } public object Tag { get; set; } } 第三步:MainWindow.xmal <Grid x:Name="lay"> <View

WPF动态加载Menu菜单

有一个项目动态加载wpf的菜单控件可以非常有效的做到更具用户权限显示或控制MenuItem菜单,如何实现这种功能,其实也非常简单. 首先需要了解Wpf的menu菜单控件,她的结构其实也非常简单 <Menu DockPanel.Dock="Top" Name="MenuOptionGroup">   <MenuItem Header="菜单1">   <MenuItem Header="内容1"&g

[WPF学习笔记]动态加载XAML

好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代码. 在debug文件夹下新建一个文本文件,重命名为:file.xaml 插入界面代码: <DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Button Name=

WPF 仪表盘 刻度盘 动态 加载中 开源

原文:WPF 仪表盘 刻度盘 动态 加载中 开源 1. 表盘 参数可以设置, codeproject上写的.网址在这里. 源码里有demo,很详细. 源码在这里. 2. 动态Loading 截图效果跟实际有点不一样. 自己把源码写成 资源就好用了呗 地址在这里 3.  有两个类似的                              地址1  地址2 原文地址:https://www.cnblogs.com/lonelyxmas/p/9689224.html

Win8 Metro动态加载内容框架

制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 2012年10月第一次:因为SVG性能问题,将SVG换为cocos2d-x JSBind,可惜cocos2d-x JSBind不完善,最后换为cocos2d-x html5.11月第二次:cocos2d-x html5性能问题,破产.12月第三次:取消HTML5,转为使用XAML+JS模式. (微软

页面滚动图片等元素动态加载插件jquery.scrollLoading.js

如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的就不用加载了.这样还可以在一定程度上节省服务器资源.该插件作者的网页将该插件的功能和使用方法描述的非常详细,这里把最一般最普遍的使用情况给大家展现一下. 插件作者:http://www.zhangxinxu.com/ 首先我们需要加载jQuery库和本插件js文件. (jquery.scrollLo

EasyUi -- 如何根据动态加载panel和Datagrid

在做项目的过程中,前台的面板和表格一般都不是固定的,它是根据后台传来的数据进行变化的.举个例子: 实现: 看一下我们的效果图: 这个上面的最左边的Panel要根据系别动态加载,有多少个系别就要加载都少个Panel,Panel里面的是一个table,这个里面也是动态加载出来. 右边是一个datagrid,datagrid里面的工作效率.业务能力等等也都是数据库动态加载出来的,包括后面的ABCD也是动态的. 这样就算数据库中的数据怎么变,这里都会动态地加载出来.那么怎么实现这些功能呢? 一.动态加载

Python模块动态加载机制

本文和大家分享的主要是python中模块动态加载机制相关内容,一起来看看吧,希望对大家学习python有所帮助. import 指令 来看看 import sys 所产生的指令: co_consts : (0, None) co_names : ('sys',) 0 LOAD_CONST               0 (0) 2 LOAD_CONST               1 (None) 4 IMPORT_NAME              0 (sys) 6 STORE_NAME  

黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

一.AngularJS动态加载控制器和视图实例 路由配置关键代码: [javascript] view plain copy print? //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据和控制器***/ views: { "": { templateUrl: function ($stateParams) { console.info($stateParams); return '/template/

动态加载JS

res/js/modules/s01.js alert("动态加载JS成功!");  形式1: <script src="layui-v1.0.9_rls/layui.js"></script> <script> layui.use("res/js/modules/s01"); </script> 形式2: <script src="layui-v1.0.9_rls/layui.js