【WPF编程宝典】第10讲:简单动画

1.基本动画

  • 这些基本动画都应用与C#代码
  • 动画是WPF模型的核心部分,让动画动起来不需要使用计时器以及事件处理代码,可使用声明的方式创建动画。
  • WPF动画第一条规则,每个动画都依赖于一个依赖项属性。
  • WPF动画第二条规则,属性的动态化需要有支持相应数据类型的动画类。比如按钮的宽度是双精度类型,需要DoubleAnimation,按钮的Padding是Thickness结构,需要ThicknessAnimation类。
  • 枚举类型通常不能应用动画,引用类型通常不能应用动画。
  • 基于路径的动画,比使用插值或关键帧的动画更加专业。通常使用类型名+AnimationUsingPath形式进行命名。如DoubleAnimationUsingPath。
  • WPF提供三种方法:线性插值,关键帧,以及路径。
  • WPF提供了42个类提供动画支持。
BooleanAnimationUsingKeyFrames,ByteAnimationUsingKeyFrames,ColorAnimation
DecimalAnimation,DoubleAnimation,DoubleAnimationUsingPath
Int16AnimationUsingKeyFrames,Int32AnimationUsingKeyFrames,Int64AnimationUsingKeyFrames
MatrixAnimationUsingPath,PointAnimation,PointAnimationUsingPath
Point3DAnimationUsingKeyFrames,ByteAnimation,CharAnimationUsingKeyFrames
ColorAnimationUsingKeyFrames,DecimalAnimationUsingKeyFrames,DoubleAnimationUsingKeyFrames
Int16Animation,Int32Animation,Int64Animation
MatrixAnimationUsingKeyFrames,ObjectAnimationUsingKeyFrames,PointAnimationUsingKeyFrames
Point3DAnimation,QuarternionAnimation,QuarternionAnimationUsingKeyFrames
RectAnimation,RectAnimationUsingKeyFrames,Rotation3DAnimation
Rotation3DAnimationUsingKeyFrames,SingleAnimation,SingleAnimationUsingKeyFrames
SizeAnimationUsingKeyFrames,ThicknessAnimation,VectorAnimation
Vector3DAnimation,SizeAnimation,StringAnimationUsingKeyFrames
ThicknessAnimationUsingKeyFrames,VectorAnimationUsingKeyFrames,Vector3DAnimationUsingKeyFrames

        一个示例

private void btn1_Click(object sender, RoutedEventArgs e)
{DoubleAnimation widthAnimation = new DoubleAnimation();widthAnimation.From = 160;widthAnimation.To = this.Width - 60;widthAnimation.Duration = TimeSpan.FromSeconds(1);btn1.BeginAnimation(Button.WidthProperty, widthAnimation);
}

2.故事板

  • 故事板(Storyboard)是BeginAnimation()方法的Xaml等价物。通过故事板将动画指定到合适的元素和属性上。
  • 事件触发:Styles.Triggers,DataTemplate.Triggers,ControlTemplate.Triggers,FrameworkElement.Triggers。
  • 重叠动画:默认HandoffBehavior属性为SnapshotAndReplace,也就是快照并替换。可使用HandoffBehavior的另一个枚举值Compose实现第二个动画融合到第一个动画的时间线中。
  • 动画同步:也就是多个动画为一组,时间线相同。只需将多个动画写到一个<Storyboard>中,并指定相同的时间。
  • 可使用SpeedRatio对动画进行调速,使用BeginTime属性对动画开始时间进行偏移。
  • 控制播放:继承自ControllableStoryboardAction类的动作类可以控制播放的状态。
    • PauseStoryBoard:停止播放动画并且保持其当前位置
    • ResumeStoryboard:恢复播放暂停的动画
    • StopStoryboard:停止播放动画,并将动画时钟重新设置到开始位置
    • SeekStoryboard:跳到动画时间线中的特定位置。如果动画当前正在播放,就继续从新位置播放。如果动画当前是暂停的,就继续保持暂停
    • SetStoryboardSpeedRatio:改变整个故事板(而不仅是改变某个内部动画)的 SpeedRatio 属性值
    • SkipStoryboardToFill:将故事板移到时间线的终点。从技术角度看,这个时期就是所谓的填充区域(6llregion)。对于标准动画,FiBchavior属性设置为HoldEnd,动画继续保持最后的值
    • RemoveStoryboard:移除故事板,停止所有正在运行的动画并将属性返回为原来的、最后一次设置的数值。这和对适当的元素使用nul动画对象调用BeginAnimation()方法的效果相同
  • button缩放简单示例
<Style x:Key="ButtonStyle"><Style.Triggers><Trigger Property="Button.IsPressed" Value="True"><Trigger.EnterActions><BeginStoryboard><Storyboard><DoubleAnimation Storyboard.TargetProperty="Width" To="250" Duration="0:0:5"/></Storyboard></BeginStoryboard></Trigger.EnterActions></Trigger></Style.Triggers>
</Style>
  • 检索当前动画的时间可以使用GetCurrentTime()和GetCurrentProgress。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 如何创建线程】

创建线程的方式一&#xff1a;继承Thread类 步骤&#xff1a; 定义一个类继承Thread类覆盖Thread类中的run&#xff08;&#xff09;方法直接创建Thread类的子类对象创建线程调用start方法开启线程并调用线程的任务run方法执行。 如果线程的目的是为了开启一条执行路径去运行…

互联网技术基础-计算机人必看

目录 1.Internet的工作原理 1、Internet是一个分组交换系统 2、路由器是Internet实现互连的“标准件” 3、TCP/IP是Internet的核心协议 4、客户机/服务器的工作模式 2. IP地址 2.1 IP地址分类 2.2特殊IP地址 2.3路由器和IP编制原则 2.4子网的划分 2.5 IPV6 3.域名系…

【因果推断python】46_估计量2

目录 连续型干预变量案例 非线性处理效果 关键思想 连续型干预变量案例 目标转换方法的另一个明显缺点是它仅适用于离散或二元处理。这是你在因果推理文献中经常看到的东西。大多数研究都是针对二元干预案例进行的&#xff0c;但您找不到很多关于连续干预的研究。这让我很困…

Bytebase 对接本地部署的 llama3 开启ChatSQL功能

Bytebase 是为开发人员、测试、DBA和运维工程师构建的数据库 DevOps 领域的&#xff0c;类 GitLab/GitHub 平台。 这篇文章主要关注 Bytebase SQL 编辑器中的 AI 增强功能。使用此功能您可以使用自然语言在 Bytebase SQL 编辑器中查询数据库。同时还能给出针对查询的索引建议&…

RK3568技术笔记十四 Ubuntu创建共享文件夹

单击“虚拟机”&#xff0c;单击“设置”&#xff0c;如图所示&#xff1a; 单击“选项”&#xff0c;选择“总是启用&#xff08;E&#xff09;”&#xff0c;单击“添加”&#xff0c;如图所示&#xff1a; 单击“下一步”&#xff0c;如图所示&#xff1a; 单击“浏览”添加…

Ranger配置图片及json文件预览

文章目录 前言下载apt下载pip下载 配置使用json文件预览方法一 修改scope用cat预览方法二 安装jq预览配置ranger 图片文件预览方法一 使用img2txt预览方法二 使用fim预览配置ranger 总结 前言 本文主要讲解Ranger12如何配置json及图片的预览设置&#xff0c;如下是ranger的介绍…

Spring AI 整合openAI的chatGpt

Spring AI支持ChatGPT&#xff0c;这是OpenAI的AI语言模型。ChatGPT在激发人们对人工智能驱动文本生成的兴趣方面发挥了重要作用。 SpringAi与Spring Boot 的整合详见上一篇文章&#xff1a; Spring AI 介绍以及与 Spring Boot 项目整合 下面分四个部分来分别说明和演示&#…

简单分享github

一、官网 GitHub: Let’s build from here GitHub 二、注册 通过简单的注册步骤&#xff0c;你就可以拥有一个属于自己的GitHub账号。再简单注册完成之后会需要验证你所输入的邮箱才能正常使用你的GitHub。 三、设置自己的库 在注册完成之后&#xff0c;完成一些简单的设置之…

Zookeeper 集群节点实现通信原理(一)

Zookeeper 集群节点实现通信原理(一) 多节点部署完启动时,为了选举发送自己节点选举的信息,是如何实现通信的,实现原理 在 Zookeeper 的多节点集群中,为了选举领导节点,每个节点需要互相通信以发送和接收选举信息。 这种通信是通过一种称为 Fast Leader Election 的算法…

简单且高效的水域物探轨迹坐标转换程序

简单且高效的水域物探轨迹坐标转换程序 前言 水上测线的高精度定位是水域物探的难题&#xff0c;水域磁法、水域地震实施时常采用船舶拖拽传感器进行走航式观测&#xff0c;GPS仪器放在船舶上测量&#xff0c;造成船舶位置与传感器位置存在偏差&#xff0c;后期资料整理需要校…

mvn dependency -D outputFile=dependency_tree.txt

命令解析 mvn dependency:tree&#xff1a;运行Maven的dependency:tree目标&#xff0c;生成项目的依赖树。 DoutputFiledependency_tree.txt&#xff1a;将生成的依赖树输出到dependency_tree.txt文件中&#xff0c;而且是每个独立模板输出自己的依赖。

互联网应用主流框架整合之Spring Boot基本概念

Spring Boot是用来简化Spring应用程序的搭建、开发、测试和部署过程的&#xff0c;该框架使用了特定的方式进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置&#xff0c;SpringBoot致力于快速应用开发(Rapid Application Development)领域的发展&#xff0c;它通过…

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了的解决方法

安防视频监控汇聚EasyNVR智能安防视频监控平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括&#xff1a;…

vscode插件开发之 - TestController

TesController概要介绍 TestController 组件是用于实现自定义测试框架和集成测试结果的。它允许开发者定义自己的测试运行器&#xff0c;以支持在VSCode中运行和展示测试。以下是一些使用 TestController 组件的主要场景&#xff1a; 自定义测试框架&#xff1a;如果你正在开发…

C++语法19 循环嵌套结构(for/while循环)

语法阶段已经更新到第18章了&#xff0c;前面的知识你都学会了吗&#xff1f;如果还没有学习前面的知识&#xff0c;请点击&#x1f449;语法专栏进行学习哦&#xff01; 目录 循环嵌套 训练&#xff1a;数字矩形 解析 参考代码 训练&#xff1a;星号三角形 解析 参考代码 …

Scikit-Learn梯度提升决策树(GBDT)

Scikit-Learn梯度提升决策树 1、梯度提升决策树(GBDT)1.1、Boosting方法1.2、GBDT的原理1.3、GBDT回归的损失函数1.4、梯度下降与梯度提升1.5、随机森林与GBDT1.6、GBDT的优缺点2、Scikit-Learn梯度提升决策树(GBDT)2.1、Scikit-Learn GBDT回归2.1.1、Scikit-Learn GBDT回归…

【车载开发系列】CAN通信总线再理解(中篇)

【车载开发系列】CAN通信总线再理解&#xff08;中篇&#xff09; 九. CAN总线标准十. CAN物理层十一. CAN数据链路层1&#xff09;CAN的通信帧类型2&#xff09;CAN的标准帧格式1. CAN ID2. 数据场 3&#xff09;CAN总线仲裁 十二. CAN应用层1&#xff09;CANopen2&#xff09…

电力行业如何利用行列视(RCV)解决数据治理难题?

电力行业作为能源供应的重要支柱&#xff0c;面临着海量的数据处理和治理挑战。行列视&#xff08;RCV&#xff09;作为一种强大的数据应用系统&#xff0c;可以为电力行业提供有效的解决方案&#xff0c;以应对这些难题。以下是如何利用行列视&#xff08;RCV&#xff09;解决…

C语言中的位域(bit-field)是什么,以及它的用途和优缺点

在C语言中&#xff0c;位域&#xff08;bit-field&#xff09;是一种特殊的数据结构&#xff0c;它允许在结构体&#xff08;struct&#xff09;中定义其成员所占用的位数&#xff0c;而不是使用整个字节或更大的内存空间。位域通常用于存储布尔值、状态标志、硬件控制位等&…

负数在二进制中的表示方法

负数在二进制中的表示方法 1 补码介绍2 举例-10的二进制表示3 测试打印0xfffffff6值 1 补码介绍 在二进制补码表示法中&#xff0c;负数是通过取其绝对值的二进制表示&#xff08;即正数的二进制表示&#xff09;&#xff0c;然后取反&#xff08;0变1&#xff0c;1变0&#x…