问题描述:

在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下载:

http://sdrv.ms/1a0FuVU

The End.

[Windows Phone]AnimationHelper管理分散的Storyboard的更多相关文章

  1. Windows Services windows域账户管理

    windows  域账户管理 一.什么是域账户: 域账户是域是网络对象的分组.例如:用户.组和计算机.域中所有的对象都存储在 Active Directory 下.Active Directory 可 ...

  2. 新版Windows Azure CDN管理门户正式上线

    经过产品团队的不懈努力,新版Windows Azure CDN管理门户在经过了有限开放预览之后,已经正式上线并开放给所有用户. 新版Windows Azure CDN管理门户经过全新的设计,除了在使用 ...

  3. 一个tabBarController管理多个Storyboard

    随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护.然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6.6+出来 ...

  4. Windows使用SSH管理Ubuntu

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/manage-ubuntu-on-wind ...

  5. windows服务器基本管理及服务搭建

    windows服务器基本管理及服务搭建 ****windows服务器系统版本:2000 2003 2008 2012 1.用户与组管理 用户:账户=账号/用户名+密码 每个账户有自己唯一的SID 账户 ...

  6. Windows 自动化补丁管理

    Windows 自动化补丁管理 Desktop Central,这一倍受欢迎的补丁管理软件旨在修补可能导致安全薄弱.破坏关键系统数据或导致系统不可用的漏洞.管理此类软件漏洞对网络管理员来说简直是噩梦. ...

  7. Windows Server 2016-Powershell管理站点复制

    对于Active Directory的Windows PowerShell包括管理复制.网站.域和森林,域控制器以及分区的能力.例如Active Directory的站点和服务管理单元和repadmi ...

  8. Windows AD域管理软件是什么?

    Windows AD域管理软件是什么? ADManager Plus是一个简单易用的Windows AD域管理工具,帮助域管理员简化日常的管理工作.通过直观友好的操作界面,可以执行复杂的管理操作,比如 ...

  9. Windows之磁盘管理

    0x01 磁盘管理概述 ​ 磁盘管理是一项计算机使用时的常规任务,它是以一组磁盘管理应用程序的形式提供给用户的,他们位于计算机管理控制台中,它包括查错程序和磁盘碎片整理程序以及磁盘整理程序.(来源百度 ...

随机推荐

  1. cmake手册详解----转

    参考链接:http://www.cnblogs.com/coderfenghc/tag/cmake/

  2. NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本

    写在前面:     本文将创建NGUI的第一个样例.依照编程传统,第一个样例,就是做一个Hello world 显示出来.NGUI.我们用Label来实现 . 欢迎大家纠错.拍砖!原创非常辛苦,如有转 ...

  3. 关于js基础easy忘记的那些事儿

    1.Number() 通过这个函数转化后的值仅仅有两个:数值和NaN,通过parseInt也能转化为数值.可是像"134df"转化后的值为134,而Number("134 ...

  4. ModelConvertHelper(将DataTable转换成List<model>)

      public class ModelConvertHelper<T> where T : new() {      public static IList<T> Conve ...

  5. Ch04 充满动作的控制器

    4.1  考察控制器和动作 4.1.1  IController与控制器基类 4.1.2  如何形成动作方法 4.2  哪些应该放在动作方法中 4.2.1  手动映射视图模型 4.2.2  输入验证 ...

  6. 基于visual Studio2013解决C语言竞赛题之1020订票

         题目 解决代码及点评 /* 某航空公司规定:在旅游旺季7─9月份,若订票超过20张,优惠票价的15%,20张以下,优惠5%: 在旅游淡季1─5月.10月.11月份订票超过 ...

  7. 函数指针&amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  8. 遍历关联数组 index by varchar2

    --字符串序列要这样 declare     type t   is table of number(3) index by varchar2(3);    hash_t t;      l_row ...

  9. Swift - 使用UISearchController实现带搜索栏的表格

    我原来写过一篇文章“Swift - 带结果列表的搜索条(UISearchDisplayController)的用法”,当时是使用UISearchDisplayController来实现带有搜索功能的列 ...

  10. ASP.NET - 出错页

    配置Web.config,配置customError区域. <system.web> <customErrors mode ="RemoteOnly" defau ...