[Windows Phone]AnimationHelper管理分散的Storyboard
问题描述:
在Windows Phone开发时候,可能存在这样的问题:
某一个控件需要一个特定的展现(这里假定是一个特定动画),那么我们会这么解决这个问题呢?
打开Blend,根据需求需求给控件添加动画,Building,Runing,任务完成。
过了一段时间,在另外一个地方,同样的控件需要同样的动画展现。
此时会有两个做法:
(1).到之前已经完成实现的.xaml中,Copy xaml代码,粘贴到当下需要它的地方,然后做适当修改之后即可使用。
(2).对此需求进行封装,使用UserControl或者自定义控件都可以实现。
显然第一种方法必须坚决杜绝,而要使用第二种方法,让代码可复用,易维护。
现在介绍第三种方法,使用AnimationHelper
简介:
AnimationHelper其实只是使用XamlReader加载xaml,生成Storyboard,然后执行.

如何使用:
1.使用Blend创建我们需要的Storyboard

Storyboard的XAML描述如下:

(显然以上的XAML描述的Storyboard是我们通过Blend创建的满足需求的Storyboard,为了方便维护和重用,我们把它复制到AnimationHelper中)
2.创建AnimationHelper类,定义相关方法
a).添加方法,返回值为Storyboard。(如果需要控制动画的执行时间,可以通过参数传入,对XAML稍作修改,通过string.Format拼接到正确的地方)
public class AnimationHelper
{
public static Storyboard BtnAnimation(UIElement uiElement)
{
Storyboard sb = null; // Storyboard的XAML描述
string templateString = string.Format(@"
XAML描述"); // 如果涉及到形状变换,则UIElement的RenderTransform属性需要被赋值,
// 为了避免在前段XAML忘记定义RenderTransform,所以在这里每一次
// 都创建RenderTransform
uiElement.RenderTransform = new CompositeTransform(); // 设置动画锚点
uiElement.RenderTransformOrigin = new Point(0.5, 0.5); // 加载XAML
sb = XamlReader.Load(templateString) as Storyboard; // 为Storyboard的Children设置作用对象
foreach (var t in sb.Children)
Storyboard.SetTarget(t, uiElement); return sb;
}
}
b).复制Blend生成的Storyboard,替换上述代码中的"XAML描述"
注意:
(下面把Blend生成的XAML称作原XAML)
<1>把原XAML中的Storyboard.TargetName="xxxx"部分去掉。因为我们将通过方法参数出入Target
<2>正确解析双引号。(在原XAML中,每逢碰到双引号,就在之前再加一个双引号)
<3>加入XAML名字空间。解析XAML时,需要知道它的名字空间,所以我们需要在原XAML中加入它的名字空间。把xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""加入到Storyboard标签中作为其属性
public static Storyboard BtnAnimation(UIElement uiElement)
{
Storyboard sb = null; // Storyboard的XAML描述
string templateString = string.Format(@"
<Storyboard xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
Storyboard.TargetProperty=""(UIElement.RenderTransform).(CompositeTransform.ScaleX)"">
<DoubleAnimationUsingKeyFrames>
<EasingDoubleKeyFrame KeyTime=""0:0:0.2"" Value=""0.5"">
<EasingDoubleKeyFrame.EasingFunction>
<CubicEase EasingMode=""EaseIn""/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime=""0:0:0.4"" Value=""1"">
<EasingDoubleKeyFrame.EasingFunction>
<QuinticEase EasingMode=""EaseOut""/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=""(UIElement.RenderTransform).(CompositeTransform.ScaleY)"">
<EasingDoubleKeyFrame KeyTime=""0:0:0.2"" Value=""0.5"">
<EasingDoubleKeyFrame.EasingFunction>
<CubicEase EasingMode=""EaseIn""/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime=""0:0:0.4"" Value=""1"">
<EasingDoubleKeyFrame.EasingFunction>
<QuinticEase EasingMode=""EaseOut""/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>"); // 如果涉及到形状变换,则UIElement的RenderTransform属性需要被赋值,
// 为了避免在前段XAML忘记定义RenderTransform,所以在这里每一次
// 都创建RenderTransform
uiElement.RenderTransform = new CompositeTransform(); // 设置动画锚点
uiElement.RenderTransformOrigin = new Point(0.5, 0.5); // 加载XAML
sb = XamlReader.Load(templateString) as Storyboard; // 为Storyboard的Children设置作用对象
foreach (var t in sb.Children)
Storyboard.SetTarget(t, uiElement); return sb;
}
3.使用AnimationHelper
在我们需要执行的地方,调用刚定义的方法,传入UI元素
void button2_Click(object sender, RoutedEventArgs e)
{
var sb = AnimationHelper.BtnAnimation(this.button2);
if (sb != null)
{
sb.Begin();
}
}
AnimationHelper优劣分析:
优势:
1.折中的管理零散的Storyboard,无需封装控件,把Storyboard紧紧耦合在控件内,复用简单。
不足:
1.把UI逻辑引入了业务逻辑中,违背了MVVM模式设计理念。
2.对于复杂的Storyboard则不太适用(因为双引号太多... 哈哈)
3.调试困难。(那里漏了一个双引号则很难发现)
4.使用XamlReader实时解析XAML,效率较低
总结:
从优劣分析中可以看出,不足之处多余优点,所以使用这种方法的时候需要慎重考虑,但是如果用对地方或者用法巧妙也许能规避此解决方案的不足而得到出奇的效果
Demo下载:
The End.
[Windows Phone]AnimationHelper管理分散的Storyboard的更多相关文章
- Windows Services windows域账户管理
windows 域账户管理 一.什么是域账户: 域账户是域是网络对象的分组.例如:用户.组和计算机.域中所有的对象都存储在 Active Directory 下.Active Directory 可 ...
- 新版Windows Azure CDN管理门户正式上线
经过产品团队的不懈努力,新版Windows Azure CDN管理门户在经过了有限开放预览之后,已经正式上线并开放给所有用户. 新版Windows Azure CDN管理门户经过全新的设计,除了在使用 ...
- 一个tabBarController管理多个Storyboard
随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护.然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6.6+出来 ...
- Windows使用SSH管理Ubuntu
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/manage-ubuntu-on-wind ...
- windows服务器基本管理及服务搭建
windows服务器基本管理及服务搭建 ****windows服务器系统版本:2000 2003 2008 2012 1.用户与组管理 用户:账户=账号/用户名+密码 每个账户有自己唯一的SID 账户 ...
- Windows 自动化补丁管理
Windows 自动化补丁管理 Desktop Central,这一倍受欢迎的补丁管理软件旨在修补可能导致安全薄弱.破坏关键系统数据或导致系统不可用的漏洞.管理此类软件漏洞对网络管理员来说简直是噩梦. ...
- Windows Server 2016-Powershell管理站点复制
对于Active Directory的Windows PowerShell包括管理复制.网站.域和森林,域控制器以及分区的能力.例如Active Directory的站点和服务管理单元和repadmi ...
- Windows AD域管理软件是什么?
Windows AD域管理软件是什么? ADManager Plus是一个简单易用的Windows AD域管理工具,帮助域管理员简化日常的管理工作.通过直观友好的操作界面,可以执行复杂的管理操作,比如 ...
- Windows之磁盘管理
0x01 磁盘管理概述 磁盘管理是一项计算机使用时的常规任务,它是以一组磁盘管理应用程序的形式提供给用户的,他们位于计算机管理控制台中,它包括查错程序和磁盘碎片整理程序以及磁盘整理程序.(来源百度 ...
随机推荐
- 使用回溯法求所有从n个元素中取m个元素的组合
不多说了,直接上代码,代码中有注释,应该不难看懂. #include <stdlib.h> #include <stdio.h> typedef char ELE_TYPE; ...
- PHP - 接口 - 单一接口
/* * 接口的使用 */ //定义接口 interface IPerosn{ public function eat(); public function water(); } //定义继承自接口的 ...
- js打印
js打印,其实是打印当前页面的内容,是调用 系统的js方法,来弹出 打印设置窗口,用法很简单. window.print()就行,有的考虑到 浏览器兼容性问题,会用到document.execComm ...
- 来自中油瑞飞的SQL笔试题20131202
1.有三张表,用户表,用户角色表,角色表, 使用sql显示如下内容: 用户ID,用户名,超级管理员,录入员,会计 也就是角色用逗号分隔. 解: 1.填充数据到表User select * from [ ...
- 基于visual Studio2013解决面试题之0510连续数之和
题目
- Basic4android:多功能的Android应用软件快速开发平台
Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...
- C# - ref
The ref keyword causes an argument to be passed by reference, not by value. The effect of passing by ...
- Linux-C语言中gettimeofday()函数的使用方法(转载)
1.简介: 在C语言中可以使用函数gettimeofday()函数来得到时间.它的精度可以达到微妙 2.函数原型: #include<sys/time.h> int gettimeofda ...
- 怎样使用jstack诊断Java应用程序故障(转)
最近一段时间,我们的生产系统升级频繁出现故障,具体故障现象是启动后10来分钟就出现交易缓慢,处理线程耗尽等现象,并且故障发生的频率蛮高的.经过详细的诊断和排查,终于发现了问题,是groovy在osgi ...
- SQL 事务及实例演示
简介 事务,英文名称是transaction.是在对数据库进行管理操作过程中一个逻辑单位,由有限的操作序列构成. 其实这个概念很好懂,简单理解就是:事务就是在使用数据库中的一个操作,由一些操作放到一起 ...