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。
WPF当属性值改变时利用PropertyChanged事件来加载动画的更多相关文章
- 利用CAReplicatorLayer实现的加载动画
在上一篇中,笔者简要介绍了CAReplicatorLayer,在本篇中,将介绍具体的实用价值. 实用CAReplicatorLayer作为核心技术实现加载动画. 首先,创建一个UIView的子类 @i ...
- WPF依赖属性值源(BaseValueSource)
原文:WPF依赖属性值源(BaseValueSource) WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源 其以BaseValueSource枚举表示 1.Default public ...
- DataGridView中DataGridViewComboBoxColumn的一些相关应用(一)让其值改变时触发事件-转
转自 https://maodaili.de/mao.php?u=a%2FMrbEvUE8PnCuc7FrhJi0Rqd3kmOBHPZUbcJ1c2hbJUK0RYWpAf4lhIOddItP%2 ...
- jquery chosen onchange 值改变时触发方法
jquery chosen onchange 值改变时触发方法如下:$(".chzn-select").chosen().on("change", functi ...
- input中的内容改变时触发的事件
input中的内容改变时触发的事件 1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发:onproperty ...
- 当input中的内容改变时触发的事件
当input中的内容改变时触发的事件 1 $('#id').bind('input propertychange', function() { //处理内容 } 循环js事件 $(document). ...
- WPF动画 - Loading加载动画
存在问题: 最近接手公司一个比较成熟的产品项目开发(WPF桌面端),其中,在登陆系统加载时,60张图片切换,实现loading闪烁加载,快有密集恐惧症了!!! 代码如下: private void L ...
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...
- WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource.Binding 前/后台加载,重新绑定) 2013.6.7更新 1.xmlns Mapping URI的格式是 clr-namespace:&l ...
随机推荐
- 小a的轰炸游戏 (差分)
我是看题解的! 这道题还是有很多细节,当然,是一道差分的好题! 题意:有2种飞机,一种是只炸上半菱形,一种是炸整个菱形.问所有区域内的所有格子的异或和. 思路:用前缀和思路: 这样遍历过去就完成了一次 ...
- 【转】Win10开机密码忘了?教你破解Win10开机密码
[PConline 技巧]Win10开机密码忘记了怎么办?这个问题很多人都遇到过,如何破解一台Win10电脑的开机密码呢(非BIOS开机密码)?其实很简单,利用下面这个方法,分分钟就能搞定. 一招破解 ...
- mybatis error
2018-08-02 14:01:18.021 WARN org.apache.catalina.loader.WebappClassLoaderBase Line:179 - The web app ...
- 006_饿了么大前端总监sofish帮你理清前端工程师及大前端团队的成长问题!
作者|Sofish编辑|小智 & 尾尾本文是前端之巅向 sofish 的约稿<什么样的人可以称为架构师?>.采访< 饿了么大前端团队究竟是如何落地和管理的?>以及 so ...
- Ubuntu下的 PPPoE 拨号上网方法
1. 配置 pppoe $ sudo pppoeconf 2. 联网 $ sudo pon dsl-provider 3. 断网 $ sudo poff 4. 查看日志 $ plog 5. 查看接口信 ...
- 如何让Node.js运行在浏览器端
Node.js又称服务端JavaScript.今天我为了解决一个问题,通过搜索引擎找到了如何将Node.js转成浏览器端可以运行的javascript.尽管这种方式有其局限性,但是还是可以用的. 1. ...
- zabbix使用percona的mysql监控模板监控
安装第三方插件仓库源: [root@iZ9j3yrx43sb5sZ ~]# yum install https://www.percona.com/redir/downloads/percona-re ...
- java将秒转换为时分秒工具类
需要一个接收时分秒的对象,如下: package com.dq.schoolcontract.utils; import com.sun.media.jfxmedia.control.VideoRen ...
- Python黑魔法 --- 异步IO( asyncio) 协程
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...
- python中各个response使用
Python django中我们经常用的response有django中的 JsonResponse, HttpResponse,还有DRF中的Response 在使用的时候,经常会不知道如何什么时候 ...