[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 磁盘管理概述 磁盘管理是一项计算机使用时的常规任务,它是以一组磁盘管理应用程序的形式提供给用户的,他们位于计算机管理控制台中,它包括查错程序和磁盘碎片整理程序以及磁盘整理程序.(来源百度 ...
随机推荐
- 清华集训2014 day2 task3 矩阵变换
题目 算法 稳定婚姻系统(其实就是贪心) 一个方案不合法,当且仅当下面这种情况: 设第\(i\)行选了数字\(x\),如果第\(j\)行有一个\(x\)在第\(i\)行的\(x\)后面,并且第\(j\ ...
- 《C语言深度解剖》面试题整理
请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...
- Android 之SparseArray<E>详解
SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch) pr ...
- 基于JSP+SERVLET的新闻发布系统(一)
本系统使用的是基于JSP+SERVLET+TOMCAT6 数据库使用的是MYSQL IDE是MYECLIPSE8.5,页面编辑使用的是百度的ueditor,比较适合咱国人 采用MVC模式,使用的关键技 ...
- Tomcat 7最大并发连接数的正确修改方法(转)
几乎所有的中文网页都介绍,要修改Tomcat的默认最大并发连接数,应该进行如下设置(实际上这些步骤是错误的): -------------------------------------------- ...
- (转载)Jvm工作原理学习笔记
一. JVM的生命周期 1. JVM实例相应了一个独立执行的java程序它是进程级别 a) 启动.启动一个Java程序时.一个JVM实例就产生了.不论什么一个拥有publ ...
- HTML5 Canvas自定义圆角矩形与虚线(Rounded Rectangle and Dash Line)
HTML5 Canvas自定义圆角矩形与虚线(RoundedRectangle and Dash Line) 实现向HTML Canvas 2d context绘制对象中添加自定义的函数功能演示,如何 ...
- 相遇Qt5
使用Qt5.x版本中的不同方面来开发应用程序,着重于新的Qt Quick的技术,提供了编写C++后端的必要内容,并扩展了Qt Quick. 本章提供了关于Qt5高层次的概述.它对开发者有效的展 ...
- Linux下搭建 Cocos2d-x-2.1.4 编译环境
[tonyfield 2013.09.04 ] 参考 Linux下搭建 Cocos2d-x-2.1.4 编译环境 导入 HelloCpp 例程 1. Java 入口 HelloCpp.java Hel ...
- OS X 10.10 Yosemite Beta能够下载了
刚刚启动迅雷.蹦出一消息.点击后出现-- watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmlzdGE5OTk5OQ==/font/5a6L5L2T/fon ...