WPF中的动画

WPF动画——故事板(Storyboard) 1、XAML代码 <Window x:Class="故事板.MainWindow" x:Name="window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:hc="clr-namespace:故事板" Title="Ma 阅读详情

转自:http://www.cnblogs.com/zhouyinhui/archive/2007/04/10/706107.html

动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。

在WPF中我们采用Storyboard(故事板)的方式来编写动画,为了对Storyboard有个大概的印象,你可以粘贴以下代码到XamlPad来查看效果:

<!-- This example shows how to animate with a storyboard. -->
< Page xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"

WindowTitle
="Storyboards Example" >
< StackPanel Margin ="20" >

< Rectangle Name ="MyRectangle"
Width
="100"
Height
="100" >
< Rectangle .Fill >
< SolidColorBrush x:Name ="MySolidColorBrush" Color ="Blue" />
</ Rectangle.Fill >
< Rectangle .Triggers >
< EventTrigger RoutedEvent ="Page.Loaded" >
< BeginStoryboard >
< Storyboard RepeatBehavior ="Forever" AutoReverse ="True" >
< DoubleAnimation
Storyboard.TargetName ="MyRectangle"
Storyboard.TargetProperty
="Width"
From
="100" To ="200" Duration ="0:0:1" />
</ Storyboard >
</ BeginStoryboard >
</ EventTrigger >
</ Rectangle.Triggers >
</ Rectangle >
</ StackPanel >
</ Page >


在介绍Storyboard之前应该先了解Animation
Animation提供一种简单的“渐变”动画,我们为一个Animation指定开始值和一个结束值,并指定由开始值到达结束值所需的时间,便可形成一个简单的动画。比如我们指定长方形的宽度由100变化到200,所需时间为1秒,很容易想像这样的动画是什么样的,而它对应的Xaml代码如下:

< DoubleAnimation
Storyboard.TargetName ="MyRectangle"
Storyboard.TargetProperty
="Width"
From
="100" To ="200" Duration ="0:0:1" />

将它翻译成C#代码则如下:

DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From
= 100 ;
myDoubleAnimation.To
= 200 ;
myDoubleAnimation.Duration
= new Duration(TimeSpan.FromSeconds( 1 ));
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));

代码里我们定义了一个DoubleAnimation,并指定了它的开始值和结束值以及它由开始值到达结束值所需的时间。至于后面两句,它们是用来将Aniamtion与指定的对象和指定的属性相关联,等会我们将介绍。
注意到,这里我们使用的是DoubleAnimation,因为我们所要变化的是数值。那么如果我们要变化颜色是不是就用ColorAnimation了呢,对,其实出了这些之外还有PointAnimation等等,并且你可以实现IAnimatable接口来实现自定义版本的Animation。关于这些你可以参见System.Windows.MediaAniamtion名字空间.

但值得注意的是并非每个属性都能够使用Animation,它必须满足以下条件:
1,它必须是Dependency Property
2,它所在类必须继承于DependencyObject,必须实现了IAnimatable接口.
3,必须有类型一致的Animation Type(即Color类型使用ColorAniamtion,Point类型使用PointAnimation等)

一个简单的Animation定义了一个简单的动画,很容易想到的是,如果若干个Animation同时作用于一个对象,那么这个对象不就可以表现复杂的动画了吗,对,这就是Storyboard

Storyboard可以看做是Animation的容器,它包含了若干的简单动画来完成一个复杂动画。
参考以下代码:

<!-- This example shows how to animate with a storyboard. -->
< Page xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"

WindowTitle
="Storyboards Example" >
< StackPanel Margin ="20" >

< Rectangle Name ="MyRectangle"
Width
="100"
Height
="100" >
< Rectangle .Fill >
< SolidColorBrush x:Name ="MySolidColorBrush" Color ="Blue" />
</ Rectangle.Fill >
< Rectangle .Triggers >
< EventTrigger RoutedEvent ="Page.Loaded" >
< BeginStoryboard >
< Storyboard RepeatBehavior ="Forever" AutoReverse ="True" >
< DoubleAnimation
Storyboard.TargetName ="MyRectangle"
Storyboard.TargetProperty
="Width"
From
="100" To ="200" Duration ="0:0:1" />
< ColorAnimation
Storyboard.TargetName ="MySolidColorBrush"
Storyboard.TargetProperty
="Color"
From
="Blue" To ="Red" Duration ="0:0:1" />
</ Storyboard >
</ BeginStoryboard >
</ EventTrigger >
</ Rectangle.Triggers >
</ Rectangle >
</ StackPanel >
</ Page >

这里我们的Storyboard定义了DoubleAnimation来变化矩形的宽度,并定义了ColorAnimation来变化矩形的颜色。

至此,你已经可以编写绚丽的WPF动画了,并推荐你下载Expression Blend来制作WPF动画.



但你会发现使用XAML标记的方式来编写动画虽然很简单,但缺乏了C#等程序设计语言的灵活性,比如我们的矩形动画中矩形的宽度是由后台逻辑计算出来的变量值,我们的动画将如何编写呢,这时我更喜欢使用C#的方式来编写动画,虽然这所需的代码量更大.
以下重点介绍如何用C#编写动画,并且这更助于你理解Storyboard是如何工作的。

参考以下代码:
         this.Name = "PageMain";
myRectangle.Name
= "MyRectangle";

NameScope.SetNameScope(
this, new NameScope());
this.RegisterName(myRectangle.Name, myRectangle);

DoubleAnimation myDoubleAnimation
= new DoubleAnimation();
myDoubleAnimation.From
= 100;
myDoubleAnimation.To
= 200;
myDoubleAnimation.Duration
= new Duration(TimeSpan.FromSeconds(1));
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));


Storyboard myStoryboard
= new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);

this.Loaded += delegate(object sender, MouseEventArgs e)
{
myStoryboard.Begin(
this);
};
其中:

DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From
= 100;
myDoubleAnimation.To
= 200;
myDoubleAnimation.Duration
= new Duration(TimeSpan.FromSeconds(1));
定义了一个DoubleAniamtion,并指定了它的开始值和结束值以及所需的时间.
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);设置myDoubleAniamtion的作用对象是"myRectangle",注意到传入的第二个参数是一个字符串myRectangle.Name,那么我们的程序怎么知道"myRectangle"这个字符串就是指我们的矩形对象myRectangle呢,这里存在一个名称与对象的映射,即我们的"myRectangle"映射到矩形对象myRectangle,为了构造这个映射我们涉及到了NameScope(名字域)这个概念.
NameScope.SetNameScope(this, new NameScope());
this.RegisterName(myRectangle.Name, myRectangle);
上面的代码中,this设置了一个名字域,myRectagle向这个名字域注册了自己的名字,这样我们的程序就可以通过this的名字域来查找到myRectangle与"myRectangle"之间的映射关系了,关于NameScope可以参见MSDN
WPF Namescopes主题.
为了让myDoubleAnimation知道它所作用的属性是谁,我们使用
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.WidthProperty));语句来将Aniamtion与属性关联起来,其中PropertyPath中指定要作用的对象所对应的DependencyProperty.
然后我们将定义好的myDoubleAniamtion添加到myStoryboard的Children中去.最后就可以通过调用Storyboard的Begin(FrameworkElement)方法来开始我们的动画.

Begin方法的另一个重载形式是
public void Begin (FrameworkContentElement containingObject,bool isControllable),第二个参数表明我们的storyboard是否是可控的,如果可控的话,我们可以像控制播放器一样控制来控制storyboard,关于控制Storyboard请参考Storyboard类中的Pause,Seek等方法.

至此也许我们会认为这些知识足以应付简单的动画了,现在让我们一起设计一个简单的动画,也许会发现些问题.

假设我们的界面中存在一个Button对象button1,我们设计一个简单的动画让它在窗口中的x坐标从0连续变化到100,然后在从100变化到0,如此重复.也许我们会编写如下的代码:

WPF中的渐变色动画 WPF中的渐变色动画 开发工具与关键技术:Visual Studio 2015、WPF 撰写时间:2019年6月14日 下面我们使用渐变色来做一个关键帧动画,我先布局一个网格布局,在网格布局里面定义两行,上面定义一个按钮,这个按钮是用来触发这个动画的,这个按钮用来触发在下面写好的动画,点一下按钮,这个动画就会执行一次,在下面写好了基本的样式之后,要在上面定义一个Triggers触发器来触发动画... 阅读详情

相关推荐

WPF中的PathAnimation(路径动画)

                                   WPF中的PathAnimation(路径动画)                                                               周银辉在WPF中我们可以指定元素按照某一路径运动而形成动画,这称之为路径动画,在SDK中你会发现以[Type]AnimationUsingPath这

zhouyinhui的专栏 8002

关于WPF中Storyboard的TargetProperty属性的认识

按照《WPF Unreleased》一书介绍,Storyboard有一个TargetProperty字段用来指定目标属性的。偶在实践的时候,发现Storyboard已经没有了该字段了。 [code="xml"] [/code] 查了一下MSDN,上面介绍是: [u]XAML 不能在 XAML 中使用字段。[/u] 可以采用下述替代的方式来给TargetProperty字段赋值: ...

蛋疼先生的手札 3930

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 865

【WPF学习】第五十章 故事板

  正如上一章介绍,WPF动画通过一组动画类(Animation类)表示。使用少数几个熟悉设置相关信息,如开始值、结束值以及持续时间。这显然使得它们非常适合于XAML。不是很清晰的时:如何为特定的事件和属性关联动画,以及如何在正确的时间触发动画。   在所有声明式动画中都会用到如下两个要素:   故事板。故事板是BeginAnimation()方法的XAML等价物。通过故事板将动画指定到合适的元素和属性。   事件触发器。事件触发器响应属性变化或事件(如按钮的Click事件),并控制故事板。例如,为了开始.

imherer的博客 2648

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 422

MinIO vs 华为云OBS:成本、性能与兼容性深度对比(含实测数据)

本文深度对比了开源对象存储MinIO与华为云OBS在成本、性能、兼容性及运维方面的核心差异。通过实测数据与全生命周期成本分析,为技术决策者提供选型依据。文章指出,MinIO在长期成本控制、性能深度优化及S3 API兼容性方面优势显著,而华为云OBS则提供开箱即用的便利性。

kmeans3miner的博客 593

WPF动画之故事板

WPF动画通过一组动画类表示,使用少数几个属性设置相关信息,如开始值、结束值以及持续时间。 Storyboard:故事板 故事板是BeginAnimation()方法的XAML等价物,通过故事板将动画指定到合适的元素和属性。 故事板是增强的时间线,可用来分组多个动画,而且具有控制动画播放的能力---暂停、停止以及播放位置。 而Storyboard类提供的最基本功能是,能够使用Targ...

weixin_44587257的博客 767

LoRa双端通信稳定性核心:同步字配置与LLCC68工程实践

LoRa是一种基于扩频调制的远距离低功耗无线通信技术,其物理层鲁棒性依赖于发射端与接收端在频率、带宽、扩频因子及同步字等关键参数上的严格一致。同步字作为LoRa帧结构中位于前导码之后的2字节标识字段,承担着物理层帧过滤与网络隔离的核心作用,直接影响通信成功率与抗干扰能力。在实际嵌入式开发中,尤其采用LLCC68等专用射频芯片时,同步字配置错误或双端不一致是导致‘能发不能收’‘间歇性丢包’等典型问题的首要原因。本文面向STM32等Cortex-M平台开发者,结合硬件一致性约束、驱动移植方法论与寄存器级调试手段

weixin_36019375的博客 130

WPF动画如何使用?炫酷的WPF UI必须掌握,赶紧学起来

使用WPF,可以轻松地创建复杂的图形和动画,实现各种交互效果,以及使用各种不同的数据绑定和样式。无论你是初学者还是有经验的开发人员,都可以通过学习WPF来开发具有创新性和吸引力的应用程序。赶紧学起来吧!

Documentlv的博客 4771

[ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042

[ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042 Django 组件存在 SQL 注入漏洞,该漏洞是由于对 QuerySet.order_by()中用户提供数据的过滤不足,攻击者可利用该漏洞在未授权的情况下,构造恶意数据执行 SQL 注入攻击,最终造成服务器敏感信息泄露。

qq_51577576的博客 3228

Spring AI提示词模板应用

本文介绍了使用SpringAI提示词模板的配置方法,主要步骤包括:1)在JDK17和SpringBoot3.4.4环境下引入spring-ai-alibaba1.0.0.2依赖;2)配置application.yml文件;3)创建测试控制器类处理提示词模板(.st文件);4)通过模板变量动态生成AI回复内容。演示了如何通过@RequestParam设置默认参数,实现无需前端传参即可测试AI回复功能,最终完成了一个SpringAI提示词模板的应用Demo。

wjianwei666的专栏 196

WPF中的动画——序

WPF中的动画功能可以让你非常容易地把动态效果添加到应用程序或者组件中。这也是WPF中最容易被滥用的特性之一。用好了,可以让我们的软件受益匪浅。 在WPF中,动画有着明确的定义:随着时间的推移变化属性的值。因此,为了达到这一目的,可以几种方式来实现。 一、定时器实现动画 配置一个定时器,然后依据定时器的频率循环地调用它的回调函数。在回调函数中,你可以手工地更新目标的属性...

de14141983的专栏 123

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

WPF中的动画——(4)

学习WPF的动画,非常值得一提的是关键帧动画。普通的动画实现的是从一个值到另一个值的线性内插(或者有限形式的非线性内插,归功于AccelerationRatio和DecelerationRatio)。而关键帧动画,指定了在指定的时间达到指定的值(由XXXKeyFrame的KeyTime、Value决定),因此,可以实现更加复杂的动画。 除了Fro...

de14141983的专栏 278

飞牛fnNAS虚拟机开启OVS导致失联的解决

摘要:用户在使用飞牛NAS时发现开启OVS网络功能后导致NAS失联。通过多种尝试(包括开关OVS、更换系统版本、手工配置、更换网卡、处理器检查等)后发现,OVS启用状态下DHCP无法获取IP地址,手动设置IP可暂时恢复网络。但重启后问题依旧,初步判断为OVS功能存在bug。目前临时解决方案是在需要时手动开关OVS,或考虑其他虚拟化方案。用户计划后续探索替代方案,并等待官方修复该问题。

dgnankai的专栏 4331

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WPF中的动画——(5)

我们见识了普通的动画类、关键帧动画类,当然,还有一种动画类需要我们了解,那就是基于路径的动画。它有3个类型:DoubleAnimationUsingPath、MatrixAniamtionUsingPath和PointAnimationUsingPath。 基于路径的动画允许你指定PathGeometry作为对象行进的路径来改变对象的位...

de14141983的专栏 251

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[转]WPF中的动画

WPF中的动画 周银辉动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。在WPF中我们采用Storyboard(故事板)的方式来编写动画,为了对Storyboa...

weixin_30335353的博客 108

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 图解北京户口的经济学意义
下一篇: C#对象序列化
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值