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

XAML:
<Window x:Class="WpfDispatcherTimerAnimation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfDispatcherTimerAnimation"
mc:Ignorable="d"
Title="MainWindow" Height="" Width="">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Ellipse Name="rectangle" Height="" Width="" Fill="Aquamarine"/>
<Button Content="开启动画" Click="ButtonBase_OnClick" Height="" Width="" Grid.Row=""/>
</Grid>
</Window>
C#代码:
using System;
using System.Windows;
using System.Windows.Threading; namespace WpfDispatcherTimerAnimation
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 长方形减小计时器
/// </summary>
DispatcherTimer dispatcherTimerDecrease = new DispatcherTimer(); /// <summary>
/// 长方形增大计时器
/// </summary>
DispatcherTimer dispatcherTimerIncrease = new DispatcherTimer(); /// <summary>
/// 按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
dispatcherTimerIncrease.Interval = TimeSpan.FromMilliseconds();
dispatcherTimerIncrease.Tick += dispatcherTimerIncrease_Tick;
dispatcherTimerIncrease.Start();
dispatcherTimerDecrease.Interval = TimeSpan.FromMilliseconds();
dispatcherTimerDecrease.Tick += DispatcherTimerDecrease_Tick;
} /// <summary>
/// 增加计时器事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DispatcherTimerDecrease_Tick(object sender, EventArgs e)
{
if (rectangle.Width < || rectangle.Height < )
{
(sender as DispatcherTimer).Stop();
dispatcherTimerIncrease.Start();
}
else if (rectangle.Width >= || rectangle.Height >= )
{
rectangle.Width -= ;
rectangle.Height -= ;
}
} /// <summary>
/// 减少计时器事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dispatcherTimerIncrease_Tick(object sender, EventArgs e)
{
if (rectangle.Width < || rectangle.Height < )
{
rectangle.Width += ;
rectangle.Height += ;
}
else if (rectangle.Width >= || rectangle.Height >= )
{
(sender as DispatcherTimer).Stop();
dispatcherTimerDecrease.Start();
}
}
}
}
2.基于桢的动画
由CompositionTarget类来完成,它提供了一个回调函数(Rendering的事件处理函数),WPF会在每次界面刷新时调用该回调函数。CompositionTarget的刷新率与窗体保持一致,因此很难人工控制动画的快慢。
案例:
效果图:

XAML:
<Window x:Class="Wpf基于桢的动画.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Wpf基于桢的动画"
mc:Ignorable="d"
Title="MainWindow" Height="" Width="">
<Grid >
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Ellipse Name="ellipse" Height="" Width="" Fill="Aquamarine"/>
<Button Grid.Row="" Content="开启动画" Height="" Width="" Click="ButtonBase_OnClick" />
</Grid>
</Window>
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading; namespace Wpf基于桢的动画
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
CompositionTarget.Rendering+=new EventHandler(CompositionTarget_Rendering);
} private void CompositionTarget_Rendering(object sender, EventArgs e)
{
if (ellipse.Width < || ellipse.Height < )
{
ellipse.Width += ;
ellipse.Height += ;
}
else if (ellipse.Width >= || ellipse.Height >= )
{
CompositionTarget.Rendering-=new EventHandler(CompositionTarget_Rendering);
}
}
}
}
3.基于属性的动画
用一个DoubleAnimation类制定起始值(From=“”)、终点值To=“”、时间(Duration=“0:0:2.7”),以及动画结束应该(FillBehavior=”Stop”)。设置好之后该矩形调用BeginAnimation方法开始实现动画,BeginAnimation制定需要应用动画的属性和创建的DoubleAnimation。
案例:
效果图:

XAML:
<Window x:Class="Wpf基于属性的动画.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Wpf基于属性的动画"
mc:Ignorable="d"
Title="MainWindow" Height="" Width="">
<Grid >
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Ellipse Name="ellipse" Height="" Width="" Fill="Aquamarine"/>
<Button Grid.Row="" Content="开启动画" Height="" Width="" Click="ButtonBase_OnClick" />
</Grid>
</Window>
C#:
using System;
using System.Windows;
using System.Windows.Media.Animation;
using System.Windows.Shapes; namespace Wpf基于属性的动画
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
DoubleAnimation doubleAnimation=new DoubleAnimation();
doubleAnimation.From = ;
doubleAnimation.To = ;
doubleAnimation.Duration = TimeSpan.FromMilliseconds();
doubleAnimation.FillBehavior = FillBehavior.Stop;
ellipse.BeginAnimation(Ellipse.WidthProperty,doubleAnimation);
DoubleAnimation doubleAnimation1 = new DoubleAnimation();
doubleAnimation1.From = ;
doubleAnimation1.To = ;
doubleAnimation1.Duration = TimeSpan.FromMilliseconds();
doubleAnimation1.FillBehavior = FillBehavior.Stop;
ellipse.BeginAnimation(Ellipse.HeightProperty, doubleAnimation);
}
}
}
WPF实现动画的几种方式及其小案例的更多相关文章
- Spring框架访问数据库的两种方式的小案例
1.1 以Xml的方式访问数据库的案例 要以xml的方式访问数据库需要用到JdbcTemplate ,因为 JdbcTemplate(jdbc的模板对象)在Spring 中提供了一个可以操作数据库的对 ...
- 加载gif动画的三种方式
GifView.h/** * 调用结束就开始播放动画,如果需要用户指定何时播放的话,只需要把timer的开始放到合适的位置.通过对CFDictonaryRaf 也就是gifProperties的改变, ...
- WPF实现导航的几种方式
下面是展示的是几种导航方式: 我们来具体看下xaml文件 <Page x:Class="WPF实现Navigation.Page1" xmlns="http://s ...
- 实现activity跳转动画的若干种方式
第一种: (使用overridePendingTransition方法实现Activity跳转动画) 在Activity中代码如下 /** * 点击按钮实现跳转逻辑 */ button1.setOnC ...
- Android系统移植与调试之------->如何修改开机动画的两种方式剖析
首先,我们先来分析一下源码: frameworks/base/cmds/bootanimation/BootAnimation.cpp 首先看一下定义的常量: BootAnimation::ready ...
- WPF设置样式的几种方式
第一种方式是直接使用Setter来进行,可以对Background等进行设置. <Window.Resources> <Style TargetType="Button&q ...
- 前端制作动画的几种方式(css3,js)
制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式. 1.css ...
- IOS 动画的两种方式
方式一: [UIView animateWithDuration:1 animations:^{ //动画的内容 CGRect frame = CGRectMake([UIParam widthScr ...
- Cocos2d-x3.3beta0创建动画的3种方式
1.单独载入精灵对象 渲染效率低,浪费资源,不推荐用该方法.代码例如以下:注:代码仅仅需贴到HelloWorldScene.cpp中就可以. //First,单独渲染每个精灵帧 auto sprite ...
随机推荐
- pageadmin CMS网站建设教程:站点添加自定义字段
首先看看pagedmin默认的站点设置都有什么,如下图: 这里只有一些最基本的参数设置,用过3.0版本或用过其他公司开发的cms的用户应该有这种体验,在站点设置中可以设置logo图片,备案号,底部内容 ...
- 【Oracle 12c】最新CUUG OCP-071考试题库(57题)
57.(14-17) choose two: Examine the structure of the DEPARTMENTS table You execute the following comm ...
- 如何外部访问你的本地网站natapp
用natapp,要实名制才可以获得免得authtoken 1.注册登录: https://natapp.cn/tunnel/lists 2.这个要填写一下,端口我写的是3000 3.客户端下载 解压: ...
- js加密解密 base64
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- 喝最烈的酒、挖最大的DONG——工具与技巧篇
本文作者:i春秋签约作家——黑色镰刀 0×00 前言 在这个科技发达的时代,很多时候工具都可以代替人做很多事情,之前我就有谈起过有企业将人工智能运用于网络安全方面,像如今,也有更多更人性化更智能的工具 ...
- 【Qt】Qt在Windows下的开发与调试环境配置
前文已经交待了从源码编译Qt自定义版本.现在可以开始配置一下开发与调试程序并写个Hello World了. 1. IDE 虽然Qt官方有VS插件使我们可以在VisualStudio中开发Qt应用,但我 ...
- [CISCO] VLAN、TRUNK 和 VTP 简介
VLAN.TRUNK 和 VTP 简介 VLAN 如图,虚拟局域网 VLAN ( Virtual LAN ) 是交换机端口的逻辑组合. VLAN 工作在 OSI 的第 2 层(数据链路层),一个 VL ...
- Linux 中排除掉筛选的文件
以下命令以网站目录www为例做介绍,有时候更新网站的时候需要保留比如图片目录,或者其他目录就需要这样的操作 实例一: 删除文件夹内所有文件只保留一个文件命令 [root@linuxzgf www]# ...
- [转载+整理]Nginx Location匹配规则
目录 规则语法 location 分类 匹配顺序: 扩展 location / {}和 location =/ {}的区别 测试 规则语法 语法 匹配规则 空 普通匹配(遵循最大前缀匹配规则, 优先度 ...
- mysql工具——mysqlcheck(MYISAM)
基本介绍 演示: 使用optimize的时候,可能会出现 Table does not support optimize, doing recreate + analyze instead 这时候参考 ...