写在前面:本文代码摘自《Head First C#》

本文使用ObjectAnimationUsingKeyFrames + Storyboard构建一个动画。

ObjectAnimationUsingKeyFrames为关键帧动画,它允许为动画设置几个关键帧,其中每一帧为ObjectKeyFrame类型。ObjectKeyFrame为抽象类,实际使用的是DiscreteObjectKeyFrame,它是ObjectKeyFrame的派生类,表示目标是不连续变化的。ObjectAnimationUsingKeyFrames的KeyFrames属性即为关键帧集合。DiscreteObjectKeyFrame的Value属性为该帧的值,KeyTime属性为该帧的时间点信息。

Storyboard可执行一组动画,下面的示例代码只包含一个动画。其SetTarget方法指定执行动画的界面元素,SetTargetProperty方法指定该动画应用到该界面元素的哪个属性上。定义并设置好动画后,将动画添加到Storyboard的Children中。

RepeatBehavior属性表示动画的重复行为。取值为0代表不播放,取其它double值控制循环次数,取RepeatBehavior.Forever表示一直循环。AutoReverse属性表示是否以相反的动画方式从终止值返回起始值。

// 前台,UserControl标记的代码
<Grid>
<Image x:Name="iamge" Streach="Fill" />
</Grid> // 后台代码
public sealed partial class AnimatedImage:UserControl
{
// 使用xaml创建控件,必须有一个无参构造函数
public AnimatedImage()
{
this.InitializeComponent();
} publi AnimatedImage(IEnumerable<string> imageNames, TimeSpan interval)
:this()
{
StartAnimation(imageNames, interval);
} public void StartAnimation(IEnumerable<string> imageNames,
TimeSpan interval)
{
Storyboard storyboard = new Storyboard();
ObjectAnimationUsingKeyFrames animation =
new ObjectAnimationUsingKeyFrames();
storyboard.SetTarget(animation, image);
storyboard.SetTargetProperty(animation, "Source"); TimeSpan currentInterval = TimeSpan.FromMilliseconds(0);
foreach(string imageName in imageNames)
{
ObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame();
keyFrame.Value = CreateImageFromAssets(imageName);
keyFrame.KeyTime = currentInterval;
animation.KeyFrames.Add(keyFrame);
currentInterval = currentInterval.Add(interval);
} storyboard.RepeatBehavior = RepeatBehavior.Forever;
storyboard.AutoReverse = true;
storyboard.Children.Add(animation);
storyboard.Begin();
} private static BitmapImage CreateImageFromAssets(string imageFilename)
{
return new BitmapImage(new Uri("ms=appx:///Assets/" + imageFilename));
}
}

WPF -- 构建动画的更多相关文章

  1. WPF利用动画实现圆形进度条

    原文:WPF利用动画实现圆形进度条 这是我的第一篇随笔,最近因为工作需要,开始学习WPF相关技术,自己想实现以下圆形进度条的效果,逛了园子发现基本都是很久以前的文章,实现方式一般都是GDI实现的,想到 ...

  2. WPF弹性模拟动画

    原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的. 胡克定律:F=-kd F代表弹性 ...

  3. WPF控制动画开始、停止、暂停和恢复

    1.闲言 好久也没更新一博客了,自己有点发懒,同时确实这几个月来也有点忙.风机监测软件,项目中,有这样一个小需求:正常风机在旋转的时候,上位机软要做一个风机的图片,让它不停地旋转,一但检测到下面风机停 ...

  4. Wpf(Storyboard)动画简单实例

    原文:Wpf(Storyboard)动画简单实例 动画的三种变换方式 RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标 CenterY纵坐标 Angle旋转角度(角度正 ...

  5. WPF实现动画的几种方式及其小案例

    WPF实现动画的方式: 基于计时器的动画 建立一个定时器,然后根据其频率循环调用函数或者一个事件处理函数,在这个函数中可以手工更新目标属性,直到达到最终值,这时可以停止计时器. 案例: 效果图: XA ...

  6. WPF 构建无外观(Lookless)控件

    原文:WPF 构建无外观(Lookless)控件 构建一个用户可以使用Template属性设置外观的WPF控件需要以下几步 1.继承自System.Windows.Controls.Control 2 ...

  7. WPF之动画

    原文:WPF之动画 线性关键帧.不连续关键帧动画: <Window.Triggers> <EventTrigger RoutedEvent="Window.Loaded&q ...

  8. WPF后台动画DoubleAnimation讲解

    WPF后台动画,使用DoubleAnimation做的. 1.移动动画 需要参数(目标点离最上边的位置,目标点离最左边的位置,元素名称) Image mImage = new Image(); Flo ...

  9. C# WPF 时钟动画(2/2)

    模拟实现时钟效果,学习WPF动画好例子,本文承接上文 C# WPF 时钟动画(1/2). 微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# ...

随机推荐

  1. Git实现1个项目2个地址1次推送

    Git实现1个项目2个地址1次推送 考虑到不需要pull操作,因此本方法适用于个人项目分别在两个平台或地址进行部署 给origin 增加一个可以push的地址 git remote set-url - ...

  2. 【uva 534】Frogger(图论--最小瓶颈路 模版题)

    题意:平面上有N个石头,给出坐标.一只青蛙从1号石头跳到2号石头,使路径上的最长便最短.输出这个值.(2≤N≤200) 解法:最小瓶颈树.而由于这题N比较小便可以用2种方法:1.最短路径中提到过的Fl ...

  3. Codeforces Round #664 (Div. 2) D. Boboniu Chats with Du

    传送门:cf1395D 题意 给定一个长度为n的数组a[i]为当天说话的有趣值,如果a[i]>m,那么在 i 之后有d天不能说话.否则可以每天都说话.找到一个排列使得n天有趣值总和最大,问有趣值 ...

  4. Codeforces Round #627 (Div. 3) B - Yet Another Palindrome Problem(逻辑)

    题意: 问一个数组中是否存在至少长为3的回文子数组(按下标排列,可不连续). 思路: 找三个相同数或两个不连续的相同数. #include <bits/stdc++.h> using na ...

  5. 单源最短路问题 Dijkstra 算法(朴素+堆)

    选择某一个点开始,每次去找这个点的最短边,然后再从这个开始不断迭代,更新距离. 代码: 朴素(vector存图) #include <iostream> #include <cstd ...

  6. 5.2 spring5源码--spring AOP源码分析三---切面源码分析

    一. AOP切面源码分析 源码分析分为三部分 1. 解析切面 2. 创建动态代理 3. 调用 源码的入口 源码分析的入口, 从注解开始: 组件的入口是一个注解, 比如启用AOP的注解@EnableAs ...

  7. TCP 连接

    面试题传送 TCP 报文格式 此处介绍建立或者断开TCP连接时,需要了解的TCP报文段首部字段含义: 序列号 seq:占4个字节(32位),用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上 ...

  8. 编写一个c函数,该函数给出一个字节中被置为1的位的个数

    请编写一个c函数,该函数给出一个字节中被置为1的位的个数 #include <stdio.h> void fun(char ch) { int i; int temp; int count ...

  9. java有序数组的有序交集

    public static void main(String[] args) throws ParseException { int[] a = {4,5,-1,-1}; int[] b = {-1, ...

  10. Java开发工程师最新面试题库系列——集合部分(附答案)

    集合 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 说说常见的集合有哪些? 答:主要分List.Set.Map.Queue四类,其中包含ArrayList.LinkedList.HashSe ...