示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写
原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写
一、目的:通过对StoryBoard和Animation的封装来简化动画的编写
二、示例:

说明:渐隐藏是WPF中比较常用的动画,上图是通过StoryBoarService封装后的效果,在代码中只要执行如下代码即可:
DoubleStoryboardEngine.Create(1, 0, 1, "Opacity").Start(element);
上面的关闭效果可以定义一个命令如下:
-
public class CollapsedOfOpacityCommand : ICommand
-
{
-
-
public bool CanExecute(object parameter) => true;
-
-
public void Execute(object parameter)
-
{
-
if(parameter is UIElement element)
-
{
-
var engine = DoubleStoryboardEngine.Create(1, 0, 1, "Opacity");
-
-
engine.Start(element);
-
}
-
}
-
-
public event EventHandler CanExecuteChanged;
-
}
在Xaml中调用如下命令即可完成关闭渐隐藏的效果
Command="{x:Static base:CommandService.CollapsedOfOpacityCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=GroupBox}}"
传入的CommandParmeter将会在执行命令时渐隐藏
其中动画效果的代码只需一句代码即可,简化了动画在代码中繁琐的编码过程
DoubleStoryboardEngine.Create(1, 0, 1, "Opacity").Start(element);
二、代码:
目前只实现DoubleAnimation的封装,后续将会对其他类型进行封装
1、封闭修改基类
-
/// <summary> 动画引擎基类 </summary>
-
public abstract class StoryboardEngineBase : IDisposable
-
{
-
protected Storyboard storyboard = new Storyboard();
-
-
public EventHandler CompletedEvent { get; set; }
-
-
public EasingFunctionBase Easing { get; set; } = EasingFunctionFactroy.PowerEase;
-
-
public PropertyPath PropertyPath { get; set; }
-
-
public Duration Duration { get; set; }
-
-
public void Dispose()
-
{
-
storyboard.Completed -= CompletedEvent;
-
}
-
-
public abstract StoryboardEngineBase Start(UIElement element);
-
-
public abstract StoryboardEngineBase Stop();
-
-
public StoryboardEngineBase(int second, string property)
-
{
-
this.PropertyPath = new PropertyPath(property);
-
this.Duration = new Duration(TimeSpan.FromSeconds(second));
-
}
-
-
}
-
-
/// <summary> 动画泛型引擎基类 </summary>
-
public abstract class StoryboardEngineBase<T> : StoryboardEngineBase
-
{
-
public StoryboardEngineBase(T from, T to, int second, string property) : base(second, property)
-
{
-
this.FromValue = from;
-
this.ToValue = to;
-
}
-
-
public T FromValue { get; set; }
-
-
public T ToValue { get; set; }
-
-
//public RepeatBehavior RepeatBehavior { get; set; };
-
-
}
2、开放扩展DoubleStoryboardEngine
-
/// <summary> DoubleAnimation动画引擎 </summary>
-
public class DoubleStoryboardEngine : StoryboardEngineBase<double>
-
{
-
public static DoubleStoryboardEngine Create(double from, double to, int second, string property)
-
{
-
return new DoubleStoryboardEngine(from, to, second, property);
-
}
-
-
public DoubleStoryboardEngine(double from, double to, int second, string property) : base(from, to, second, property)
-
{
-
-
}
-
-
public override StoryboardEngineBase Start(UIElement element)
-
{
-
// Do:时间线
-
DoubleAnimation animation = new DoubleAnimation(1, 0, this.Duration);
-
-
if (this.Easing != null)
-
animation.EasingFunction = this.Easing;
-
-
//if (this.RepeatBehavior != default(RepeatBehavior))
-
// animation.RepeatBehavior = (RepeatBehavior);
-
-
// Do:属性动画
-
storyboard.Children.Add(animation);
-
Storyboard.SetTarget(animation, element);
-
Storyboard.SetTargetProperty(animation, this.PropertyPath);
-
-
if (CompletedEvent != null)
-
storyboard.Completed += CompletedEvent;
-
storyboard.Begin();
-
-
return this;
-
}
-
-
public override StoryboardEngineBase Stop()
-
{
-
this.storyboard.Stop();
-
-
return this;
-
}
-
}
3、过度效果工厂
-
/// <summary> 说明:https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/graphics-multimedia/easing-functions </summary>
-
public static class EasingFunctionFactroy
-
{
-
/// <summary> PowerEase:创建加速和/或减速使用的公式的动画f(t) = tp其中 p 等于Power属性。 </summary>
-
public static PowerEase PowerEase { get; set; } = new PowerEase();
-
/// <summary> BackEase:略微收回动画的动作,然后再开始进行动画处理指示的路径中。 </summary>
-
public static BackEase BackEase { get; set; } = new BackEase();
-
/// <summary> ElasticEase:创建类似于弹簧来回直到静止的动画 </summary>
-
public static ElasticEase ElasticEase { get; set; } = new ElasticEase();
-
/// <summary> BounceEase:创建弹跳效果。 </summary>
-
public static BounceEase BounceEase { get; set; } = new BounceEase();
-
/// <summary> CircleEase:创建加速和/或减速使用循环函数的动画。 </summary>
-
public static CircleEase CircleEase { get; set; } = new CircleEase();
-
-
/// <summary> QuadraticEase:创建加速和/或减速使用的公式的动画f(t) = t2。 </summary>
-
public static QuadraticEase QuadraticEase { get; set; } = new QuadraticEase();
-
-
/// <summary> CubicEase:创建加速和/或减速使用的公式的动画f(t) = t3。 </summary>
-
public static CubicEase CubicEase { get; set; } = new CubicEase();
-
/// <summary> QuarticEase:创建加速和/或减速使用的公式的动画f(t) = t4。 </summary>
-
public static QuarticEase QuarticEase { get; set; } = new QuarticEase();
-
/// <summary> QuinticEase:创建加速和/或减速使用的公式的动画f(t) = t5。 </summary>
-
public static QuinticEase QuinticEase { get; set; } = new QuinticEase();
-
-
/// <summary> ExponentialEase:创建加速和/或减速使用指数公式的动画。 </summary>
-
public static ExponentialEase ExponentialEase { get; set; } = new ExponentialEase();
-
-
/// <summary> SineEase:创建加速和/或减速使用正弦公式的动画。 </summary>
-
public static SineEase SineEase { get; set; } = new SineEase();
-
-
}
4、使用方法:
/// <summary> 构造方法 </summary>
/// <param name="from"> 起始值</param>
/// <param name="to"> 结束值 </param>
/// <param name="second"> 间隔时间秒 </param>
/// <param name="property"> 修改属性名称 </param>
///
public static DoubleStoryboardEngine Create(double from, double to, int second, string property)
{
return new DoubleStoryboardEngine(from, to, second, property);
}
下载地址:https://github.com/HeBianGu/WPF-ControlBase.git
示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写的更多相关文章
- Salesforce 自定义标签在代码中的应用
自定义标签简介 Salesforce 中自定义标签(Custom Label)的作用是存储一般性的文本,可以用于 Apex.Visualforce 页面.Lightning 组件等地方,用于显示提示信 ...
- SQL语句在查询分析器中可以执行,代码中不能执行
问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...
- JDK中ThreadDump诊断Java代码中的线程死锁问题
多线程的死锁..死锁不是死了而是线程互相等待... 在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题. JavaJDK为我们提供了一个诊断工具叫做ThreadDu ...
- .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
.NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的.不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数. 你可能会觉得这样没有什么用, ...
- VS中批量删除cs代码中的#region和#endregion
Visual Studio中如何批量删除cs代码中的#region和#endregion,不删除它们中间的代码,只删除这两个标记及标记的注解的方法.Vs中提供了很强大的文本查找与替换功能,简单的替换只 ...
- Android中自定义veiw使用Java中的回调方法
//------------------MainActivity----中---------------------------------- import android.os.Bundle;imp ...
- Xpath在选择器中正确,在代码中返回的是空列表问题
一.问题: 在进行爬虫的时候我们会用到xpath解析html文件,但是会有一种情况就是在xpath选择器中可以使用,但是在代码中就无法使用的情况. 二.原因: 1.是元素中有tbody的原因,这个元素 ...
- c代码中调用c++,c++代码中调用c代码
注意这里的c调用c++或者c++调用c的意思是.c文件中调用.cpp文件中的代码,或者相反 集成开发环境如vc++6.0或者vs都是通过文件后缀来区别当前要编译的是C代码还是C++代码,然后采用相应的 ...
- [django]模板中自定义变量&django模板中的变量
django自定义模板变量 context_processors.py def mysetings(request): return { 'NAME': 'maotai' } settings.py ...
随机推荐
- 小程序插件集成functional-page-navigator真机调试报错
小程序集成插件 插件里面有functional-page-navigator标签 一."小程序开发版已过期,请重新扫码连接" 真机在调用插件的时候报错 "小程序开发版已过 ...
- Linux服务器安全加固
关于对公司网站服务器安全加固的一些想法及思路: 一.修改密码和ssh登录端口,并且尽可能的用密钥对登录,禁止用密码登录(主要针对Linux)二.修改/etc/hosts.allow 设置仅仅允许某几台 ...
- HDU1754 && HDU1166 线段树模板题
HDU1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于 ...
- docker更改默认存储路径
systemctl stop docker mkdir /data/docker cp -r /var/lib/docker/* /data/docker mv /var/lib/docker /va ...
- Nginx——请求head被过滤
前言 nginx代理服务器,app发出的请求头被直接过滤了,当时想到nginx会自动过滤掉带有_的请求头信息,所以直接改了Nginx的配置当然也可以将app的request中header中的_改为- ...
- reactnative遇到的问题总结
1.View中出现文本报错,View等标签中不能出现字符串文本,字符串文本需要包在Text中,遇到如下错误 下面是问题代码: let rightTitle = this.props.rightTitl ...
- Sublime Text2中的快捷方式及html各种标签(待完善)
快捷方式 1.xhtml+tab 2.自动补全标签 Alt + . 补全标签 标签 1.<p>段落标签 ,前后换行 <h1.2.3.4.5>标题标签 h1最大,一级标题 2. ...
- 【oracle】select into from 和 insert into select 的用法和区别
select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建.insert ...
- ESA2GJK1DH1K微信小程序篇: 小程序实现MQTT封包源码使用说明
说明 我为了后期能够快速的让小程序实现MQTT,我做了一个MQTT的封装. 功能的封装有助于后期快速的开发,还方便咱维护. 我后期的所有代码皆使用此封装库, 这一节,我就详细的介绍我封装的MQTT.j ...
- 结合<span id="outer"><span id="inter">text</span></span>这段结构,谈谈innerHTML、outerHTML、innerText之间的区别
innerHTML 输出当前标签的文本内容,如果标签内有子标签,会连子标签本身和子标签内的文本内容一起输出. #outer输出子标签本身和子标签的内容:<span id="inter& ...