当前位置: 首页 > 编程日记 > 正文

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
      View Code
  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
      View Code
  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         }
    View Code

转载于:https://www.cnblogs.com/shadow-fei/p/4625521.html

相关文章:

ORA-06502 when awr report produce

最近在生成一套系统的AWR报告时出现了如下报错&#xff1a;ORA-06502: PL/SQL: numeric or value error: character string buffer too small&#xff0c;然后生成AWR报告的过程就终止了&#xff0c;查看生成的AWR报告&#xff0c;发现报告时不完整的&#xff0c;AWR报告到Comp…

进程间通信学习小结(共享内存)

要使用共享内存&#xff0c;应该有如下步骤&#xff1a;1.开辟一块共享内存 shmget()2.允许本进程使用共某块共享内存 shmat()3.写入/读出4.禁止本进程使用这块共享内存 shmdt()5.删除这块共享内存 shmctl()或者命令行下ipcrm 共享内存可以说是最有用的进程间通信方式&#xff…

[ObjectiveC]NSDATA, NSDICTIONARY, NSSTRING互转

2019独角兽企业重金招聘Python工程师标准>>> NSDATA-->NSDICTIONARY NSDictionary *dict [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSDICTIONARY-->NSDATA NSData *data [NSJSONSerialization dat…

如流智会2021:技术结合场景 让企业知识懂员工

12月10日&#xff0c;“如流智会2021智能进化”在京举行&#xff0c;学界专家业界大咖云集荟聚&#xff0c;共商企业智能化转型之道。会上&#xff0c;百度集团副总裁、百度集团首席信息官&#xff08;CIO&#xff09;李莹表示&#xff1a;“智能经济时代&#xff0c;智能组织是…

WSFC 仲裁模型选择

今天我们再来详细讨论下关于WSFC的仲裁模型&#xff0c;主要仲裁模型的优缺点&#xff0c;应该如何去思考选择最佳合适方案WSFC引入仲裁&#xff0c;主要有两个目的跟踪群集当前运作票数是否符合仲裁模型协定&#xff0c;如果低于最少允许节点&#xff0c;则决定关闭群集&#…

关于进程间通信的学习心得

进程&#xff1a;进程是指独立地址空间的指令序列进程的五种状态&#xff1a;新建&#xff0c;就绪&#xff0c;运行&#xff0c;睡眠&#xff0c;僵死进程间通信&#xff1a;是不同进程之间进行一些"接触"&#xff0c;这种接触有简单&#xff0c;有复杂。机制不同&a…

Go modules基础精进,六大核心概念全解析(上)

Go 语言做开发时&#xff0c;路径是如何定义的&#xff1f;Go Mudules又为此带来了哪些改变&#xff1f;本文将会全面介绍Go Modules六大核心概念&#xff0c;包括了设计理念与兼容性原则等&#xff0c;掌握这些技术点对于管理和维护Go 模块有重要价值。 在Go Modules 的前世今…

PARAMETERS 指令

语法: PARAMETERS <p> [DEFAULT <f>] [LOWER CASE] [OBLIGATORY] [AS CHECKBOX] [RADIOBUTTON GROUP <rad>] 实例: PARAMETERS: NAME(8), AGE TYPE I, BIRTH TYPE D. OBLIGATORY:强制要求输入, 屏幕上会出現一个“√” , 使用者必须要输入才可。 AS C…

阿里发布AliGenie2.0系统,“百箱大战”用上视觉武器

天猫精灵X1的升级版X2没有预期出现&#xff0c;而人机交互系统AliGenie升级到最新的2.0版本&#xff0c;功能强大。 3月22日&#xff0c;阿里巴巴人工智能实验室总经理浅雪&#xff08;陈丽娟&#xff09;发布AliGenie2.0系统&#xff0c;它最大的改进是在1.0的基础上增加了视觉…

Centos5.6 VNC安装配置【无错版】

不严格按本步骤就会出现VNC桌面花屏&#xff0c;就是桌面分离为一层一层的。。。 ---------------------------------------- 先装X window http://blog.csdn.net/21aspnet/article/details/6997549 ---------------------------------------- Centos5.6 VNC安装配置 一、检查是…

关于IOS的屏幕适配(iPhone)——资源适配

IOS的屏幕适配几乎不需要大量的代码操作&#xff0c;更多的时间我们只是动动鼠标选择一下就搞定。可以苹果在这方面做的还是比较人性的&#xff0c;解放了开发者。 首先来说说Iphone这几种屏&#xff08;由于最近做的是iPhone APP还未涉及到iPad&#xff0c;将来涉及到iPad时会…

Go modules基础精进,六大核心概念全解析(下)

Go 语言做开发时&#xff0c;路径是如何定义的&#xff1f;Go Mudules又为此带来了哪些改变&#xff1f;本文将会全面介绍Go Modules六大核心概念&#xff0c;包括了设计理念与兼容性原则等&#xff0c;掌握这些技术点对于管理和维护Go 模块有重要价值。 在上篇中&#xff0c;我…

京东区块链白皮书解读, 做“链接器”,一次技术宣言

前天&#xff0c;京东对外发布了《京东区块链技术白皮书(2018)》。 昨天&#xff0c;京东金融发布了旨在帮助中小银行提升零售信贷效率的产品“北斗”。目前&#xff0c;“北斗”已经接入包括江苏银行、南京银行、包商银行在内的近30家银行。京东金融还与近30家商业银行共同发起…

xauth: (stdin):1: bad display name LSPPC-Lenny:1 in add command

启动vnc4server之后出现如下错误提示&#xff1a;LSPPC-Lenny:~# vnc4serverxauth: (stdin):1: bad display name "LSPPC-Lenny:1" in "add" command New ‘LSPPC-Lenny:1 (root)’ desktop is LSPPC-Lenny:1 Starting applications specified in /root/…

使用 Python 和 OpenCV 构建 SET 求解器

作者 | 小白来源 | 小白学视觉小伙伴们玩过 SET 吗&#xff1f;SET 是一种游戏&#xff0c;玩家在指定的时间竞相识别出十二张独特纸牌中的三张纸牌&#xff08;或 SET&#xff09;的模式。每张 SET 卡都有四个属性&#xff1a;形状、阴影/填充、颜色和计数。下面是一个带有一些…

Delphi XE5 常用功具与下载

1.Delphi XE5 正式版http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_win.isohttp://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_upd1_win.iso2. cnpack 助手工具http://www.cnpack.org/download/unstable/CnWizards_1.0.1.665_…

maven学习(4)-Maven 构建Web 项目

紧接着上一节(3)&#xff0c;现在maven新建web项目&#xff0c;user-web。模拟一个用户登录的需求&#xff1a; 工程结构&#xff1a; pom.xml: <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

如何查看linux版本

1. 查看内核版本命令&#xff1a; 1) [rootq1test01 ~]# cat /proc/version Linux version 2.6.9-22.ELsmp (bhcompilecrowe.devel.redhat.com) (gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1 SMP Mon Sep 19 18:00:54 EDT 2005 2) [rootq1test01 ~]# uname -a …

存储过程由结构表生成表

结构表 CREATE TABLE JGTB5001( ZDM VARCHAR2(30 BYTE), HZM VARCHAR2(100 BYTE), LX VARCHAR2(50 BYTE), JD VARCHAR2(20 BYTE), WBKLX VARCHAR2(100 BYTE), FUNCTIONNAME VARCHAR2(50 BYTE), FUNCTIONPARAMETER VARCHAR2(50 BYTE)); 生成的TB表CREATE OR REPLACE PROCEDURE P…

好礼相送|CSDN云原生 Meetup 成都站报名热烈启动,12.18见!

伴随着容器、Kubernetes及微服务等技术热度的持续攀升&#xff0c;云原生正以不可撼动之势&#xff0c;剑指云计算的下一个十年。12月18日&#xff0c;CSDN将在成都举办第三场云原生线下Meetup。在这里&#xff0c;您可以了解各大领先企业的云原生落地实践&#xff0c;与众多云…

vue-music 音乐网站

在学习完vueJS,一直想做个项目来锻炼一下,选来选去&#xff0c;还是做个网易云音乐&#xff0c;其间遇到了很多坑,也逐渐接受了vue这种组件化的思想以及从Dom操作转换为用数据去驱动视图。并且在某部分基础组件上借鉴(搬运)了elementUI的源码(不过elementUI写的是真好) 技术栈 …

shell环境变量

shell环境变量 环境变量 还记得上一章里面﹐我曾经提到过﹕当我们登入系统的时候﹐首先就获得一 shell﹐而且它也占据一个行程&#xff08;进程&#xff09;﹐然后再输入的命令都属于这个 shell 的子程序&#xff08;子进程&#xff09;。如果您学习够细心﹐不难发现我们的 sh…

apache用户认证

先创建一个“用户认证”目录&#xff08;设为abc&#xff09;[rootLAMPLINUX ~]# cd /data/www[rootLAMPLINUX www]# mkdir abc进入abc目录[rootLAMPLINUX www]# cd abc拷贝一个文件&#xff08;作用&#xff1a;验证配置是否生效&#xff09;[rootLAMPLINUX abc]# cp /etc/pas…

20个经典函数细说 Pandas 中的数据读取与存储,强烈建议收藏

作者 | 俊欣来源 | 关于数据分析与可视化大家好&#xff0c;今天小编来为大家介绍几个Pandas读取数据以及保存数据的方法&#xff0c;毕竟我们很多时候需要读取各种形式的数据&#xff0c;以及将我们需要将所做的统计分析保存成特定的格式。我们大致会说到的方法有&#xff1a;…

fastlane自动打包--详细介绍

fastlane--Packaging 自动化打包&#xff0c;通过fastlane自动发布Fastlane安装不在这里详细罗列&#xff0c;参照一下链接流程 https://www.jianshu.com/p/0a113f754c09操作步骤 1.检查Fastlane是否正确安装。输入以下命令&#xff1a; fastlane --version 复制代码可以看到Fa…

【Big Data】HADOOP集群的配置(一)

Hadoop集群的配置&#xff08;一&#xff09; 摘要: hadoop集群配置系列文档&#xff0c;是笔者在实验室真机环境实验后整理而得。以便随后工作所需&#xff0c;做以知识整理&#xff0c;另则与博客园朋友分享实验成果&#xff0c;因为笔者在学习初期&#xff0c;也遇到不少问题…

C语言 条件编译详解

预处理过程扫描源代码&#xff0c;对其进行初步的转换&#xff0c;产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C 语言中&#xff0c;并没有任何内在的机制来完成如下一些功能&#xff1a;在编译时包含其他源文件、定义宏、根据条件决定编译时是…

凝聚406万开发者 飞桨十大发布提速产业智能化

12月12日&#xff0c;由深度学习技术及应用国家工程实验室主办的WAVE SUMMIT2021深度学习开发者峰会在上海召开。百度首席技术官、深度学习技术及应用国家工程实验室主任王海峰公布飞桨最新成绩单&#xff1a;凝聚406万开发者、创建47.6万模型、服务15.7万企事业单位&#xff0…

环境变量,cp,mv,查看文档命令

2019独角兽企业重金招聘Python工程师标准>>> 一、环境变量PATH echo $PATH 打印当前的环境变量 PATH$PATH:路径 自定义环境变量 which查找某个命令的绝对路径&#xff0c;也可以查看某个命令的别名&#xff0c;which查找的范围就在PATH下的几个目录下查找&#xff1…

Linux中errno使用

当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因&#xff0c;在实际编程中用这一招解决了不少原本看来莫名其妙的问题。但是errno是一个数字&#xff0c;代表的具体含义还要到errno.…