上一篇文章粗略的介绍了一下Animation类。本篇介绍一下Storyboard。

Storyboard,姑且翻译成“故事板”吧。实际上它是一个Animation对象的容器,可以容纳多个Animation对象,并进行同意的管理,如播放、暂停等。

最重要的一点,Storyboard可以在xaml中定义。

1.在xaml中使用Storyboard

例如上一篇文章中创建了一个简单的动画:鼠标点击的时候,btn(Button类型)的宽度由当前值变到到100。

<!-- xaml代码 -->
<Button Name="btn" Content="Click Me" HorizontalAlignment="Left" VerticalAlignment="Top"
Click="btn_MouseEnter"/> // 后台代码
private void btn_MouseEnter(object sender, RoutedEventArgs e)
{
DoubleAnimation widthAnimation = new()
{
From = btn.ActualWidth,
To = 100,
Duration = new Duration(TimeSpan.FromMilliseconds(1000)) // 持续1s钟
}; // 开始动画:指定要应用动画的属性
btn.BeginAnimation(Button.WidthProperty,widthAnimation);
}

这段代码可以直接在xaml中定义。代码如下:

<Button Name="btn" Content="Click Me" HorizontalAlignment="Left" VerticalAlignment="Top">
<Button.Triggers>
<EventTrigger RoutedEvent="{x:Static Button.MouseEnterEvent}">
<BeginStoryboard Name="sizeStoryboard">
<Storyboard Storyboard.TargetName="btn" Storyboard.TargetProperty="Width">
<DoubleAnimation From="{Binding Path=ActualWidth,ElementName=btn}" To="100" Duration="0:0:1" Storyboard.TargetName="btn" Storyboard.TargetProperty="Width"/>
<DoubleAnimation From="{Binding Path=ActualHeight,ElementName=btn}" To="50" Duration="0:0:1" Storyboard.TargetName="btn" Storyboard.TargetProperty="Height"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
     <!--下面这个触发器,只是为了演示效果-->
<EventTrigger RoutedEvent="{x:Static Button.MouseLeaveEvent}">
<!--停止Storyboard:属性值会回到原始状态-->
<StopStoryboard BeginStoryboardName="sizeStoryboard" />
<!--暂停Storyboard-->
<PauseStoryboard BeginStoryboardName="sizeStoryboard"/>
<!--继续Storyboard:继续已经暂定的Storyboard-->
<ResumeStoryboard BeginStoryboardName="sizeStoryboard"/>
</EventTrigger>
</Button.Triggers>
</Button>

备注:

  1)只有在Triggers中触发Storyboard。这里使用了BeginStoryboard,表示开始播放Storyboard。

  2)Storyboard定义了三个附件属性:Target、TargetName、TargetProperty。其中Target、TargetName属性用来表示对哪个DependencyObject应用动画,前者多在后台代码中使用(因为可以很方便的通过元素的name属性找到元素),后台多用在xaml中。TargetProperty属性表示对目标元素的哪个属性应用动画。

  3)如果多个动画都是应用同一个元素,同一个属性,可以将Target、TargetName、TargetProperty等附加属性写在Storyboard中。

2.在后台代码中应用Storyboard

  上面的代码等效于如下代码(不考虑StopStoryboard 、PauseStoryboard 、ResumeStoryboard ):

<!--xaml代码-->
<Button Name="btn" Content="Click Me" HorizontalAlignment="Left" VerticalAlignment="Top" Click="btn_MouseEnter"/> // 后台代码
private void btn_MouseEnter(object sender, RoutedEventArgs e)
{
// 创建动画
DoubleAnimation widthAnimation = new()
{
From = btn.ActualWidth,
To = 100,
Duration = new Duration(TimeSpan.FromSeconds(1))
};
widthAnimation.SetValue(Storyboard.TargetProperty, btn);
widthAnimation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(Button.WidthProperty)); DoubleAnimation heightAnimation = new()
{
From = btn.ActualHeight,
To = 50,
Duration = new Duration(TimeSpan.FromSeconds(1))
};
heightAnimation.SetValue(Storyboard.TargetProperty, btn);
heightAnimation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(Button.HeightProperty)); // 创建Storyboard
Storyboard sb = new();
sb.Children.Add(widthAnimation);
sb.Children.Add(heightAnimation);
BeginStoryboard(sb);
}

备注:

  1)因为Animation需要知道自己应用到哪个对象的哪个属性上,因此需要使用SetValue()方法来设置附加属性Storyboard.TargetPropert、Storyboard.TargetPropertyProperty。

  2)在设置Storyboard.TargetPropertyProperty附加属性的值时,不能直接给Button.WidthProperty,而应该给new PropertyPath(Button.WidthProperty)。

  3)播放Storyboard是通过BeginStoryboard()方法。这个方法在FrameworkElement中定义,因此任何继承自改类的对象,都可以调用动画。但是,到底是谁调用的,无所谓。例如本例中,是通过this(也就是Window类的实例)调用的。也可以使用btn(Button类的实例)来调用。

暂时介绍到这里吧。这两篇文章也仅仅是开个头,更多应用,还需要各位自己深入学习。

以上为本人自己的学习心得,仅做记录,也帮助初学者解惑。如有错误,还请大神指正。

WPF学习 - 动画基础(2)的更多相关文章

  1. Expression Blend学习动画基础

    原文:Expression Blend学习动画基础 什么是动画(Animation)? 动画就是时间+换面的组合,画面跟着时间变化.最常见的是flash的动画,还有GIF动态图片. 动画的主要元素 时 ...

  2. [WPF系列]从基础起步学习系列计划

    引言 WPF技术已经算不什么新技术,一搜一大把关于WPF基础甚至高级的内容.之前工作中一直使用winform所以一直没有深入学习WPF,这次因项目中使用了WPF技术来实现比较酷的展示界面.我在这里只是 ...

  3. WPF学习之绘图和动画

    如今的软件市场,竞争已经进入白热化阶段,功能强.运算快.界面友好.Bug少.价格低都已经成为了必备条件.这还不算完,随着计算机的多媒体功能越来越强,软件的界面是否色彩亮丽.是否能通过动画.3D等效果是 ...

  4. 《Programming WPF》翻译 第8章 1.动画基础

    原文:<Programming WPF>翻译 第8章 1.动画基础 动画包括在一段时间内改变用户界面的某些可见的特征,如它的大小.位置或颜色.你可以做到这一点,非常困难的通过创建一个tim ...

  5. WPF学习之绘图和动画--DarrenF

    Blend作为专门的设计工具让WPF如虎添翼,即能够帮助不了解编程的设计师快速上手,又能够帮助资深开发者快速建立图形或者动画的原型. 1.1   WPF绘图 与传统的.net开发使用GDI+进行绘图不 ...

  6. WPF学习(12)动画

    本篇来学习WPF的动画.什么是动画?动画就是一系列帧.在WPF中,动画就是在一段时间内修改依赖属性值的行为,它是基于时间线Timeline的.有人会说,要动画干嘛,华而不实,而且添加了额外的资源消耗而 ...

  7. WPF动画基础及实例

    1.介绍 在之前做winform中, 也做过一些动画效果, 但是整个动画都需要我们自己去编写, 利用计时器或线程去直接操作UI元素的属性, 然而在WPF中, 则是通过一种全新的基于属性的动画系统, 改 ...

  8. 【WPF学习】第五十三章 动画类型回顾

    创建动画面临的第一个挑战是为动画选择正确的属性.期望的结果(例如,在窗口中移动元素)与需要使用的属性(在这种情况下是Canvas.Left和Canvas.Top属性)之间的关系并不总是很直观.下面是一 ...

  9. 【WPF学习】第五十四章 关键帧动画

    到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...

  10. 【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)(评论处有学习资料及源码)

    (应博友们的需要,在文章评论处有源码链接地址,以及WPF学习资料.工具等,希望对大家有所帮助) ...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库 ...

随机推荐

  1. dnu

    背景 作为一个喜欢搬运 YouTube 视频的网友,我发现将视频下载下来再上传到 B 站十分繁琐,因此我决定开发一个小工具,能够方便快捷地将 YouTube 视频下载并上传至 B 站,以节省我的时间和 ...

  2. SpringMVC 简单的开始

    SpringMVC简单的开始 利用Spring模板配置写一个web项目. 1.核心配置文件(模板代码) <?xml version="1.0" encoding=" ...

  3. springboot+springsecurity+jwt+elementui图书管理系统

    ​​图书管理系统​​ 一.springboot后台 1.mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --> <dependency> < ...

  4. Java(包机制、doc、Scanner对象)

    包机制 本质:文件夹 用于区别类名的命名空间 一般利用公司域名倒置作为包名 import与通配符* 导入包 例: import java.util.Scanner; import com.xxx.xx ...

  5. Python异步编程之web框架 异步vs同步 Redis并发对比

    测试基本信息 主题:比较异步框架和同步框架在RedisIO操作的性能差异 python版本:python 3.8 数据库:redis 5.0.7 压测工具:locust web框架:同步:flask ...

  6. AB实验:科学归因与增长的利器

    第一章 AB实验的基本原理和应用 AB实验的相关概念: 3个基本参数:实验参与单元.实验控制参数.实验指标 2个核心价值:验证因果关系.量化策略效果 2个关键特性:先验性.并行性 基本流程:分流 -& ...

  7. 【python基础】类-模块

    随着不断给类添加功能,文件可能变得很长,即便妥善地使用了继承亦是如此,为遵循Python的总体理念,应让文件尽可能简洁.为在这方面提供帮助,Python允许将类存储在模块中,然后在主程序中导入所需的模 ...

  8. 论文日记一:AlexNet

    1.导读 ALexNet在2012图像识别竞赛中ILSVRC大放异彩,直接将错误了降低了近10个百分点. 论文<ImageNet Classification with Deep Convolu ...

  9. 2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种颜色都使用了,叫一种有效方法。 求一共有多少种有效方法。 1 <= N,

    2023-07-09:给定N.M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种颜色都使用了,叫一种有效方法. 求一共有多少种有效方法. 1 <= ...

  10. Vue学习之认识ref

    ref相当于一个dom节点,值为string 通俗将类似于原生js的document.querySelector('xxx'):但是不同的是vue是操纵虚拟dom,在渲染初期并没有这个属性,而是在创建 ...