问题描述:

在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. Bar Codes

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31329#problem/N #include<map> #include&l ...

  2. 《高质量程序设计指南:C++/C语言》面试题整理

    本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用 语法,不涉及 数据结构. 算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软 ...

  3. rackup工具

    gem包rack提供了rackup工具来启动webapplication 下面是一个入门范例,使用 bundler 管理库的一个sinatra应用   在begin文件夹下有三个文件 begin.ru ...

  4. SSH-Struts(一)——基本原理

    简单介绍 Struts框架是MVC的一个实现,它非常好的结合了JSP.Servlet.JavaBean.Taglib等技术.它为MVC的各层提供了良好的支持,就像房地产商盖房子时先盖的大楼框架. 仅仅 ...

  5. jquery Deferred使用经验

    这周做了个小活动(http://aoqi.100bt.com/zt-2016duanzi/index.html),刚开始时候没看好需求,逻辑都写一块了 最后各种坑要填补,从中也获取了些经验和教训,下面 ...

  6. 手把手教你安装QT集成开发环境(操作系统为ubuntu10.04)

    在安装QT集成开发工具包之前需要先安装build-essential和libncurses5-dev这两个开发工具和库,libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数 ...

  7. WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务

    原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...

  8. c:foreach如何嵌套循环,求指教,求优化

    java类: public class PopedomItem { private String id; private String pid; private String name; privat ...

  9. hdu1104 Remainder bfs找算式是否有解……

    须要注意的是,进行模运算剪枝-- #include<iostream> #include<queue> #include<cstdlib> #include< ...

  10. HDU 3966 Aragorn&#39;s Story(树链剖分)

    HDU Aragorn's Story 题目链接 树抛入门裸题,这题是区间改动单点查询,于是套树状数组就OK了 代码: #include <cstdio> #include <cst ...