WPF当属性值改变时利用PropertyChanged事件来加载动画
2016-01-26 21:53
381 查看
在我们的程序中,有时我们需要当绑定到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。
相关文章推荐
- 有关使用Maven常见问题总结(Eclipse中使用Maven、Maven项目部署到tomcat等问题)
- KVM之初体验——手动及自动化安装KVM脚本
- OpenGL实现多层绘制(Layered Rendering)
- 欢迎来到 Apache Hadoop®!
- Linux Shell 文本处理工具集锦
- docker日志引起系统容量问题
- Linux ALSA声卡驱动之四:Control设备的创建
- <OpenGL>Lighting
- mac osx10.11 配置安装opencv教程
- Corosync+Pacemaker+DRBD+NFS高可用实例配置
- shell编程学习1
- Top (参数)
- Linux环境搭建
- tornado 使用supervisor管理进程,使用nginx做负载均衡
- shell & dialog
- Linux操作系统CentOS7.2发行版本的安装与配置
- 网站管理之IIS怎样设置能实现同服务器上有多个不同域名的网站
- Linux-IPC之管道
- openjudge 百练 2802 小游戏
- Linux 系统下查看硬件信息命令大全