WPF当属性值改变时利用PropertyChanged事件来加载动画

简介: 原文:WPF当属性值改变时利用PropertyChanged事件来加载动画    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通过写代码的这种方式来加载动画,在我们的这篇博客中我们尽量使用简洁的语言来阐述这一方法。
原文: WPF当属性值改变时利用PropertyChanged事件来加载动画

    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通过写代码的这种方式来加载动画,在我们的这篇博客中我们尽量使用简洁的语言来阐述这一方法。

    1 首先来看一下写到资源中的Storyboard

<Storyboard x:Key="FadeIn">
            <DoubleAnimation Storyboard.TargetName="translateTransform" Storyboard.TargetProperty="X" From="-516" To="0">
                <DoubleAnimation.EasingFunction>
                    <CircleEase EasingMode="EaseIn"></CircleEase>
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
            <DoubleAnimation Storyboard.TargetName="translateTransform" Storyboard.TargetProperty="Y" From="100" To="0">
                <DoubleAnimation.EasingFunction>
                    <CircleEase EasingMode="EaseIn"></CircleEase>
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
        </Storyboard>

  这里面的translateTransform是为Canvas所定义的一个RenderTansform。

   <Canvas Grid.Row="2" x:Name="NoticeTextBlock">
         <Canvas.RenderTransform>
                <TranslateTransform x:Name="translateTransform" X="0"></TranslateTransform>
         </Canvas.RenderTransform>
         <TextBlock  Text="{Binding Path=CurrentBindingObject.Notice,Mode=TwoWay}" TextWrapping="Wrap"></TextBlock>
   </Canvas>

  2 第二步就是如何在绑定到前台的数据更新时加载动画效果。首先贴出代码,然后再做进一步的分析。

public partial class DisplayLayer : UserControl
    {        
        public DisplayLayer()
        {
            InitializeComponent();  
            Loaded+=new RoutedEventHandler(DisplayLayer_Loaded);
        }
        private void DisplayLayer_Loaded(object sender, RoutedEventArgs e)
        {
            DisplayViewModels current = this.DataContext as DisplayViewModels;
            if (current != null)
            {
                current.CurrentBindingObject.PropertyChanged+=Current_PropertyChanged;
            }
        }

        private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Notice")
            {
                Dispatcher.Invoke(new Action(() =>
                    {
                        (TryFindResource("FadeIn") as Storyboard).Begin();
                    }));
            
            }
        
        }
    }

  3 这里在当前用户控件加载完成后,找到绑定到前台的DataContext对象(这里是current.CurrentBindingObject)然后利用PropertyChanged事件来写该事件,首先我们来看一下PropertyChangedEventArgs这个类。

 // 摘要:
    //     为 System.ComponentModel.INotifyPropertyChanged.PropertyChanged 事件提供数据。
    public class PropertyChangedEventArgs : EventArgs
    {
        // 摘要:
        //     初始化 System.ComponentModel.PropertyChangedEventArgs 类的新实例。
        //
        // 参数:
        //   propertyName:
        //     已更改的属性的名称。
        public PropertyChangedEventArgs(string propertyName);

        // 摘要:
        //     获取已更改的属性名称。
        //
        // 返回结果:
        //     已更改的属性的名称。
        public virtual string PropertyName { get; }
    }

  这里面定义了当前类的构造函数,和获取已更改的属性的名称。在我们的程序中通过e.PropertyName能够获取当前属性的变化对象,这里我们找到Notice绑定的对象,然后通过(TryFindResource("FadeIn") as Storyboard).Begin();来动态加载动画,这种方式在WPF中应该是一种比较合理的加载动画的方式,另外还有一个需要注意的地方是必须是在整个窗体加载完成(Loaded加载时)才能够获取到当前绑定的DataContext否则获取的值为null。

目录
相关文章
|
13天前
|
C#
WPF —— 动画缩放变换
`ScaleTransform`用于二维x-y坐标系中对象的缩放,可沿X或Y轴调整。在故事板中,通过RenderTransform.ScaleX和ScaleY属性控制缩放。示例代码展示了如何设置按钮的RenderTransformOrigin、Background等属性,并通过LayoutTransform应用ScaleTransform。当鼠标进入按钮时,EventTrigger启动DoubleAnimation实现X和Y轴的缩放动画。最后,展示了如何将动画集成到自定义按钮样式中。
12 0
|
7月前
|
C#
WPF技术之动画系列-上下运动
本例子展现动画小球上下循环运动
125 0
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
|
前端开发 C# Windows
WPF鼠标、键盘、拖拽事件、用行为封装事件
本文主要介绍了WPF中常用的鼠标事件、键盘事件以及注意事项,同时使用一个案例讲解了拓展事件。除此之外,本文还讲述如何用行为(Behavior)来封装事件。
|
Java C# 程序员
WPF程序中的弱事件模式
原文:WPF程序中的弱事件模式 在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不是按照我们所期望的方式工作。 例如,我想实现一个在窗口的标题栏中实时显示当前的时间,一个比较常规的做法如下:     var...
1086 0
|
C#
WPF 事件触发命令
原文:WPF 事件触发命令 方法一使用mvvmlight: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.
1540 0
|
前端开发 C#
从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator?
原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...
1413 0
|
C# 开发框架
Prism for WPF再探(基于Prism事件的模块间通信)
原文:Prism for WPF再探(基于Prism事件的模块间通信) 上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一、简单介绍:   在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实现各个模块间的通信,在上一篇博文的基础上改的。
1441 0
|
.NET C# Windows
WPF 自定义路由事件
原文:WPF 自定义路由事件 WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件。 1.WPF内置路由事件   WPF中的大多数事件都是路由事件,WPF有3中路由策略: 具体不多讲,单需要注意的是WPF路由事件是沿着VIsualTree传递的。
1108 0
|
C# 索引
WPF简单模拟QQ登录背景动画
原文:WPF简单模拟QQ登录背景动画 介绍 之所以说是简单模拟,是因为我不知道QQ登录背景动画是怎么实现的.这里是通过一些办法把它简化了,做成了类似的效果 效果图   大体思路 首先把背景看成是一个4行8列的点的阵距,X轴Y轴都是距离70.
1201 0