WPF Animation For SizeChanged Of UIElement
效果图
学到一个新词:
Show me the money

背景
这几天查资料,看到 CodeProject 上面的一篇 Post 《Advanced Custom TreeView Layout in WPF》,感谢作者,将 TreeView 重定义了布局,效果如上图所示,区别在于,没有展开和收拢的动画。正巧当下在浏览一些 Behavior 的内容,突发奇想写了一个 SizeChangedAnimationBehavior,可用来附加到大多数 FrameworkElement 上,实现如上的对 SizeChanged 应用动画的效果。
考虑使用一个通用的 SizeChangedAnimationBehavior 来实现对 FrameworkElement 的功能附加,好处是功能可热插拔,可通用等。
一、代码
private void AssociatedObjectOnSizeChanged(object sender, SizeChangedEventArgs sizeChangedEventArgs)
{
// NewSize 属性,如果存在 double.NaN,则处于一次动画中,跳过此次 OnSizeChanged 处理
if (double.NaN.Equals(GetNewSize(AssociatedObject).Width) || double.NaN.Equals(GetNewSize(AssociatedObject).Height)) return;
Size oldSize = GetOldSize(AssociatedObject);
// 产生动画,注意,这里需要使用 ActualWidth/ActualHeight,并需要使用 FillBehavior.HoldEnd。这里的 Duration 可以扩展为一个附加属性,提高灵活性
DoubleAnimation wAnimation = new DoubleAnimation(oldSize.Width, AssociatedObject.ActualWidth, new Duration(TimeSpan.FromMilliseconds(150)), FillBehavior.HoldEnd);
DoubleAnimation hAnimation = new DoubleAnimation(oldSize.Height, AssociatedObject.ActualHeight, new Duration(TimeSpan.FromMilliseconds(150)), FillBehavior.HoldEnd);
// 动画结束时,需要解除属性的动画锁定,即调用 AssociatedObject.BeginAnimation(FrameworkElement.WidthProperty, null);
// 然后设置 NewSize 对应动画属性为 0(非 NaN),保证下次动画顺利执行
wAnimation.Completed += (o, args) =>
{
AssociatedObject.BeginAnimation(FrameworkElement.WidthProperty, null);
double height = GetNewSize(AssociatedObject).Height;
SetNewSize(AssociatedObject, new Size(0, height));
};
hAnimation.Completed += (o, args) =>
{
AssociatedObject.BeginAnimation(FrameworkElement.HeightProperty, null);
double width = GetNewSize(AssociatedObject).Width;
SetNewSize(AssociatedObject, new Size(width, 0));
};
// 设置 OldSize 为 ActualSize,为下次动画做准备
SetOldSize(AssociatedObject, new Size(AssociatedObject.ActualWidth, AssociatedObject.ActualHeight));
// 设置 NewSize 为 NaN,表明当前无 NewSize,处于动画执行中,执行结束后,NewSize 将恢复为 0
SetNewSize(AssociatedObject, new Size(double.NaN, double.NaN));
// 执行动画
AssociatedObject.BeginAnimation(FrameworkElement.WidthProperty, wAnimation);
AssociatedObject.BeginAnimation(FrameworkElement.HeightProperty, hAnimation);
}
代码比较简单,注意注释说明。
其中,OldSize/NewSize 是两个附加属性。
调用如下:
<TextBox x:Name="TxtAnimated" VerticalAlignment="Top" Width="200" TextWrapping="Wrap" Margin="213,12,0,-27" HorizontalAlignment="Left" Grid.Row="2">
<i:Interaction.Behaviors>
<behaviors:SizeChangedAnimationBehavior/>
</i:Interaction.Behaviors>
</TextBox>
二、其他应用效果
1)如下图,Button 的 Resize 操作,可实现动画效果;
2)如下图,Textbox 等实现 Height 的动画效果。此效果灵感(测试UI)来源于 《WPF TextBox with Animated Overflow》,感谢作者。

三、Behavior
关于 Behavior,这里不细说,大佬们的博客太多。本文主要学习于周银辉大佬的 《从WPF的AttachProperty到Sliverlight3中的Behavior》,感谢作者,很棒的文章。
WPF Animation For SizeChanged Of UIElement的更多相关文章
- 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换
原文:二维图形的矩阵变换(三)--在WPF中的应用矩阵变换 UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Vis ...
- [No000012D]WPF(5/7)依赖属性
介绍 WPF带来了很多传统 Windows 应用程序没有的新特性和选择.我们已经讨论了一些 WPF 的特性,是时候更进一步介绍其他特性了.当你读完这个系列之前的文章,我希望你已经或多或少地了解了 WP ...
- WPF/WP/Silverlight/Metro App代码创建动画的思路
在2010年之前,我都是用Blend创建动画,添加触发器实现自动动画,后来写成代码创建的方式.如今Blend已经集成到Visual Studio安装镜像中了,最新的VS2015安装,Blend的操作界 ...
- WPF 关于圆角的制作
原文:WPF 关于圆角的制作 1.使用Boder(一般情况): 设置CornerRadius属性 <Border x:Name="border" CornerRadius=& ...
- [No000012F]WPF(7/7) - 样式,触发器和动画
WPF Tutorial : Beginning [^] WPF Tutorial : Layout-Panels-Containers & Layout Transformation [^] ...
- WPF 有趣的动画效果
WPF 有趣的动画效果 这一次我要呈上一个简单的文章,关于给你的WPF apps加入美丽的光线动画,可是我对动画这东西可能有点入迷了. 实际上.我对动画如此的入迷,以至 ...
- 【WPF学习】第二十章 内容控件
内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主 ...
- Kinect 开发 —— 骨骼追踪进阶(上)
Kinect传感器核心只是发射红外线,并探测红外光反射,从而可以计算出视场范围内每一个像素的深度值.从深度数据中最先提取出来的是物体主体和形状,以及每一个像素点的游戏者索引信息.然后用这些形状信息来匹 ...
- WPF编程,通过Double Animation动态旋转控件的一种方法。
原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...
随机推荐
- kubernets之向外部应用暴露应用
一 通过NodePort来暴露服务 前面已经介绍的服务的一些作用,例如将集群内部的应用暴露给集群内部的pod使用,将外部的应用通过服务暴露给内部应用使用,但是服务最大的作用不仅仅是这些 而是将集群内 ...
- SP338 ROADS
题目描述 城市中有R条有向马路,n个马路连接点,通过每条马路都要花去一定费用.你现在在编号为1的连接点 ,手里有k元钱,要去n号连接点的最短路径的长度是多少?途中经过道路的花费不能超过k.注意:两个 ...
- 权限管理3-整合Spring Security
一.Spring Security介绍 1.框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安 ...
- JVM重新认识(一)oop-klass模型--HSDB使用验证
一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的. ...
- jquery 数据查询
jquery 数据查询 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- Netty编解码器(理论部分)
背景知识 在了解Netty编解码之前,先回顾一下JAVA的编解码: 编码(Encode):在java中称之为序列化,把内存中易丢失的数据结构或对象状态转换成另一种可存储(存储到磁盘),可在网络间传输的 ...
- CSS Color Adjustment Module Level 1
CSS Color Adjustment Module Level 1 https://drafts.csswg.org/css-color-adjust-1/ DarkMode 适配指南 | 微信开 ...
- Certbot CA 证书 https
certbot (base) a@test:~# certbot --help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
- ThinkPHP 5.0.15中的update注入漏洞
漏洞demo: public function inc() { $username = request()->get('name/a'); db('user')->insert(['nam ...
- (一)在Spring Boot应用启动之后立刻执行一段逻辑
在Spring Boot应用启动之后立刻执行一段逻辑 1.CommandLineRunner 2.ApplicationRunner 3.传递参数 码农小胖哥:如何在Spring Boot应用启动之后 ...