[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 磁盘管理概述 磁盘管理是一项计算机使用时的常规任务,它是以一组磁盘管理应用程序的形式提供给用户的,他们位于计算机管理控制台中,它包括查错程序和磁盘碎片整理程序以及磁盘整理程序.(来源百度 ...
随机推荐
- 关于java的环境变量的一点总结
配置java环境变量: 一:为了在任意目录下使用java的开发工具javac,所以将javac.exe所在的目录加入到系统路径下, 即:在环境变量的path中加入javac.exe所在的目录.一般放在 ...
- Oracle数据库索引使用及索引失效总结
容易引起oracle索引失效的原因很多: 1.在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2.新建的表还没来得及生成统计信息,分析 ...
- iOS依据字符串计算UITextView高度
iOS计算字符串高度,有须要的朋友能够參考下. 方法一:ios7.0之前适用 /** @method 获取指定宽度width,字体大小fontSize,字符串value的高度 @param value ...
- 设计模式模式适配器(Adapter)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模 ...
- 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序
原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim ...
- Spring Session - Spring Boot
The completed guide can be found in the boot sample application. Updating Dependencies Before you us ...
- XFdtd 7.3.2发布增强生物电磁学中的核磁共振功能
XFdtd 日前发布7.3.2版,该版本主要针对生物电磁学中的核磁共振(MR)进行了功能增强,另外,也对软件的用户体验和计算性能进行了部分更新. XFdtd 是基于时域有限差分(FDTD)方法的全波三 ...
- Android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO
距离上次发布(android高仿系列)今日头条 --新闻阅读器 (二) 相关的内容已经半个月了,最近利用空闲时间,把今日头条客户端完善了下.完善的功能一个一个全部实现后,就放整个源码.开发的进度就是按 ...
- Appium TestNg Maven Android Eclipse java简单启动实例
环境准备 Eclipse + maven + appium + TestNg 确保已经在Eclipse 上面安装maven TestNg的插件 打开Eclipse,新建一个java项目,把项目转换成m ...
- PDCA模型的学习
PDCA是广泛应用于质量控制中的一种管理学模型. P即plan,分析和了解当前的状况,然后作出改进的计划: D即do,执行所作出的计划: C即check,对执行的结果进行检查,要确认哪些是对的,哪些是 ...