WPF加载等待动画

简介: 原文:WPF加载等待动画 原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner 界面遮罩 等待动画全局颜色 ...

原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner


界面遮罩

    
        
    

等待动画全局颜色

 
        
    

等待动画中的小圆

 

    
        
    
    
        
    
    
        
            
                
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                        
                    
                
            
        
        
    

后台业务代码,添加了几项属性、动画控制、小圆的位置设置

    /// 
    /// LoadingWait.xaml 的交互逻辑
    /// 
    public partial class LoadingWait : UserControl
    {
        #region Data
        private readonly DispatcherTimer animationTimer;

        public int TextSize
        {
            get { return (int)GetValue(TextSizeProperty); }
            set { SetValue(TextSizeProperty, value); }
        }

        // Using a DependencyProperty as the backing store for TextSize.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextSizeProperty =
            DependencyProperty.Register("TextSize", typeof(int), typeof(LoadingWait), new PropertyMetadata(
                defaultValue: 24,
                propertyChangedCallback: new PropertyChangedCallback(
                    (sender, e) => {
                        var loading = sender as LoadingWait;
                        if(loading != null) {
                            loading.TextControl.FontSize = (int)e.NewValue;
                        }
                    })
                ));


        public Color TextColor
        {
            get { return (Color)GetValue(TextColorProperty); }
            set { SetValue(TextColorProperty, value); }
        }

        // Using a DependencyProperty as the backing store for TextColor.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextColorProperty =
            DependencyProperty.Register("TextColor", typeof(Color), typeof(LoadingWait), new PropertyMetadata(
                defaultValue: Colors.Black,
                propertyChangedCallback: new PropertyChangedCallback(
                    (sender, e) => {
                        var loading = sender as LoadingWait;
                        if(loading != null) {
                            loading.TextControl.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(e.NewValue.ToString()));
                        }
                    }),
                coerceValueCallback: new CoerceValueCallback((sender, e) => {
                    LoadingWait loading = (LoadingWait)sender;
                    try {
                        return (Color)ColorConverter.ConvertFromString(e.ToString());
                    }
                    catch(Exception ex) {
                        return Colors.Black;
                    }
                })
                ));



        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(LoadingWait), new PropertyMetadata(
                defaultValue: string.Empty,
                propertyChangedCallback: new PropertyChangedCallback(
                    (sender, e) => {
                        var loading = sender as LoadingWait;
                        if(loading != null) {
                            loading.TextControl.Text = e.NewValue.ToString();
                        }
                    })
                ));


        public string Tip
        {
            get { return (string)GetValue(TipProperty); }
            set { SetValue(TipProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Tip.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TipProperty =
            DependencyProperty.Register("Tip", typeof(string), typeof(LoadingWait), new PropertyMetadata(
                defaultValue: string.Empty,
                propertyChangedCallback: new PropertyChangedCallback(
                    (sender, e) => {
                        var loading = sender as LoadingWait;
                        if(loading != null) {
                            loading.LayoutRoot.ToolTip = e.NewValue;
                        }
                    })
                ));

        #endregion

        #region Constructor
        public LoadingWait() {
            InitializeComponent();

            animationTimer = new DispatcherTimer(
                DispatcherPriority.ContextIdle, Dispatcher);
            animationTimer.Interval = new TimeSpan(0, 0, 0, 0, 75);
        }
        #endregion

        #region Private Methods
        private void Start() {
            Mouse.OverrideCursor = Cursors.Wait;
            animationTimer.Tick += HandleAnimationTick;
            animationTimer.Start();
        }

        private void Stop() {
            animationTimer.Stop();
            Mouse.OverrideCursor = Cursors.Arrow;
            animationTimer.Tick -= HandleAnimationTick;
        }

        private void HandleAnimationTick(object sender, EventArgs e) {
            SpinnerRotate.Angle = (SpinnerRotate.Angle + 36) % 360;
        }

        private void HandleLoaded(object sender, RoutedEventArgs e) {
            const double offset = Math.PI;
            const double step = Math.PI * 2 / 10.0;

            SetPosition(C0, offset, 0.0, step);
            SetPosition(C1, offset, 1.0, step);
            SetPosition(C2, offset, 2.0, step);
            SetPosition(C3, offset, 3.0, step);
            SetPosition(C4, offset, 4.0, step);
            SetPosition(C5, offset, 5.0, step);
            SetPosition(C6, offset, 6.0, step);
            SetPosition(C7, offset, 7.0, step);
            SetPosition(C8, offset, 8.0, step);
        }

        //设置动画中小圆的位置
        private void SetPosition(Ellipse ellipse, double offset,
            double posOffSet, double step) {
            ellipse.SetValue(Canvas.LeftProperty, 50.0
                + Math.Sin(offset + posOffSet * step) * 50.0);

            ellipse.SetValue(Canvas.TopProperty, 50
                + Math.Cos(offset + posOffSet * step) * 50.0);
        }

        private void HandleUnloaded(object sender, RoutedEventArgs e) {
            Stop();
        }

        //显示控件就启动动画,隐藏(不显示)就停止动画
        private void HandleVisibleChanged(object sender,
            DependencyPropertyChangedEventArgs e) {
            bool isVisible = (bool)e.NewValue;

            if(isVisible)
                Start();
            else
                Stop();
        }
        #endregion
    }
目录
相关文章
|
C# 前端开发
WPF之动画
原文:WPF之动画 线性关键帧、不连续关键帧动画: ...
653 0
|
C#
代码创建 WPF 旋转动画
原文:代码创建 WPF 旋转动画 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a771948524/article/details/9304001 ...
804 0
|
C#
WPF 动画显示控件
原文:WPF 动画显示控件    当我们要显示一个控件的时候,不仅仅要显示这个控件,还要有动画的效果。    主要用到了DoubleAnimation类。 public static void ShowAnimation(object control) { Type type = control.
1331 0
|
C#
WPF 绕圈进度条(二)
原文:WPF 绕圈进度条(二) 一 以前的方案 以前写过一个圆点绕圈的进度条,根据参数圆点个数和参数每次旋转角度,主要是在cs文件中动态添加圆点,通过后台定时器,动态设置角度后用正弦余弦计算(x,y)的位置。
843 0
|
前端开发 C#
WPF 绕圈进度条(一)
原文:WPF 绕圈进度条(一) 在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码:     1、控件界面 ...
1402 0
|
C#
WPF中的动画
原文:WPF中的动画                                                               WPF中的动画                                                                                  周银辉动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。
869 0
|
C# 前端开发
WPF之基于路径的动画
原文:WPF之基于路径的动画   不是突然想到要做一个路径动画的,是今天谈业务需求的时候偶然谈到的,   一艘船从一个国家到另外一个国家,沿着一条固定的路线前进,就是一个简单的动画效果,以前貌似在书上看到过,所以自己也来做一个。
1094 0
|
C# 前端开发
WPF动画
原文:WPF动画 1、基本动画。 WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间隔内修改依赖项属性值的一种方式。
1779 0
|
C#
WPF通过代码动态的加载样式
原文:WPF通过代码动态的加载样式 tabitem.SetResourceReference(TabItem.StyleProperty, "mainTabItemStyle"); tabitem.Content = new Goods.GoodsMain();
1216 0
|
存储 前端开发 C#
WPF自定义控件第一 - 进度条控件
原文:WPF自定义控件第一 - 进度条控件 本文主要针对WPF新手,高手可以直接忽略,更希望高手们能给出一些更好的实现思路。 前期一个小任务需要实现一个类似含步骤进度条的控件。虽然对于XAML的了解还不是足够深入,还是摸索着做了一个。
1264 0