如何使用Action.Invoke()触发一个Storyboard
一般在我们的项目中,最好是将Storyboard放在前台,然后设置Storyboard的x:key值,通过我们的TryFindResource来查找到当前的Storyboard来启动Stroyboard,这样程序显得比较合理,另外在我们的下面这个例子中,我们通过命令绑定的方式来将2个Storyboard绑定到两个Button上面,当我们点击这两个Storyboard的时候,我们会启动相应的动画,首先来看一下前台设计的xaml代码。
<Window x:Class="ActionInvoke.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ActionInvoke;component/Themes/Colors.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Storyboard x:Key="ChangeColor" FillBehavior="Stop">
<ColorAnimation Storyboard.TargetName="ColorEllipseBrush" Storyboard.TargetProperty="Color" To="Red" Duration="0:0:1">
<ColorAnimation.EasingFunction>
<CircleEase EasingMode="EaseIn"></CircleEase>
</ColorAnimation.EasingFunction>
</ColorAnimation>
</Storyboard>
<Storyboard x:Key="ChangeSize" FillBehavior="Stop">
<DoubleAnimation Storyboard.TargetName="SizeEllipse" Storyboard.TargetProperty="Width" Duration="0:0:1" To="220">
<DoubleAnimation.EasingFunction>
<CircleEase EasingMode="EaseIn"></CircleEase>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="SizeEllipse" Storyboard.TargetProperty="Height" Duration="0:0:1" To="220">
<DoubleAnimation.EasingFunction>
<CircleEase EasingMode="EaseIn"></CircleEase>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="80*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="70*"></RowDefinition>
<RowDefinition Height="30*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"></ColumnDefinition>
<ColumnDefinition Width="50*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Row="0" Grid.Column="0" BorderBrush="Black" BorderThickness="1">
<Button x:Name="ColorEllipse" Width="100" Height="100">
<Button.Background>
<!--<LinearGradientBrush x:Name="ColorEllipseBrush" StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="#557ff2"></GradientStop>
<GradientStop Offset="0.44" Color="#557ff2"></GradientStop>
<GradientStop Offset="0.44" Color="#4d71d9"></GradientStop>
<GradientStop Offset="1" Color="#4d71d9"></GradientStop>
</LinearGradientBrush>-->
<SolidColorBrush x:Name="ColorEllipseBrush" Color="Blue" Opacity="0.75" ></SolidColorBrush>
</Button.Background> </Button>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderBrush="Black" BorderThickness="1">
<Ellipse x:Name="SizeEllipse" Width="100" Height="100" Fill="{StaticResource Decorative}"></Ellipse>
</Border>
<Border Grid.Row="1" Grid.Column="0" BorderBrush="Black" BorderThickness="1">
<Button x:Name="btn_changeColor" Background="Teal" Width="100" Height="50" Opacity="0.75" Content="ChangeColor" Command="{Binding ChangeColor}"></Button>
</Border>
<Border Grid.Row="1" Grid.Column="1" BorderBrush="Black" BorderThickness="1">
<Button x:Name="btn_changeSize" Background="Teal" Width="100" Height="50" Opacity="0.75" Content="ChangeSize" Command="{Binding ChangeSize}"></Button>
</Border>
</Grid>
</Grid>
</Window>
这个程序是一个很典型的MVVM的设计方式,首先看一下我们的ViewModel文件夹下面,记住在使用Microsoft.Practices.Prism.Commands.DelegateCommand的时候请先添加对Microsoft.Practices.Prism.Mvvm的引用,在这个类中我们添加了一个静态的实例Instance,这个静态的实例会作为一个DataContext绑定到前台,在这里我们添加了两个Action类型的委托的属性, public Action ChangeColorAction { get; set; } public Action ChangeSizeAction { get; set; },在绑定的两个命令的回调函数中,我们来通过ChangeColorAction的Invoke方法来加载Stroyboard,由于ChangeColorAction 是一种委托类型,至于委托的是哪个方法,这个需要我们来指定,下面我在贴出具体的指定的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input; namespace ActionInvoke.ViewModel
{
public class ActionInvokeViewModel:Microsoft.Practices.Prism.Mvvm.BindableBase
{
public ActionInvokeViewModel()
{
ChangeColor = new Microsoft.Practices.Prism.Commands.DelegateCommand(DoChangeColor);
ChangeSize = new Microsoft.Practices.Prism.Commands.DelegateCommand(DoChangeSize);
} public static ActionInvokeViewModel _instance;
public static ActionInvokeViewModel Instance
{
get
{
if (null == _instance)
{
_instance = new ActionInvokeViewModel();
}
return _instance;
}
set
{
_instance = value;
}
} private ICommand changeColor;
public ICommand ChangeColor
{
get { return changeColor; }
set
{
if (value != changeColor)
{
changeColor = value;
OnPropertyChanged("ChangeColor");
} } } private ICommand changeSize;
public ICommand ChangeSize
{
get { return changeSize; }
set
{
if (value != changeSize)
{
changeSize = value;
OnPropertyChanged("ChangeSize");
} }
} public Action ChangeColorAction { get; set; } public Action ChangeSizeAction { get; set; } private void DoChangeColor()
{
if (null != ChangeColorAction)
{
ChangeColorAction.Invoke();
} } private void DoChangeSize()
{
if (null != ChangeSizeAction)
{
ChangeSizeAction.Invoke();
} } } }
下面贴出view.xaml.cs文件,看到底是如何进行数据绑定的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ActionInvoke.ViewModel; namespace ActionInvoke
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ActionInvokeViewModel aivm = ActionInvokeViewModel.Instance;
DataContext = aivm;
aivm.ChangeColorAction = CurrentChangeColor;
aivm.ChangeSizeAction = CurrentChangeSize;
} private void CurrentChangeSize()
{
Dispatcher.Invoke(() =>
{
(TryFindResource("ChangeSize") as Storyboard).Begin();
});
} private void CurrentChangeColor()
{
Dispatcher.Invoke(() =>
{
(TryFindResource("ChangeColor") as Storyboard).Begin();
});
}
}
}
在该部分,我们具体指定了两个委托的回调函数,这里我们通过 (TryFindResource("ChangeColor") as Storyboard).Begin();来找到前台的Stroyboard然后再启动Storyboard来进行Storyboard的启动,整个设计是非常完善的,非常符合MVVM的设计思路;
如何使用Action.Invoke()触发一个Storyboard的更多相关文章
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染
在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
动态链接库中分配内存引起的 本文主要是探讨关于在动态链接库分配的内存在主程序中释放所产生的问题,该问题是我在刚做的PJP工程中所遇到的,由于刚碰到之时感动比较诡异(这也是学识不够所致),所以将它写下来 ...
- asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)
原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...
- 中触发一个断点 其原因可能是堆被损坏,这说明 ***.exe 中或它所加载的任何 DLL 中有 Bug
软件中使用了DevComponents.DotNetBar2.dll MessageBoxEx.Show("ddd");运行到这句出现这个错误 : 中触发一个断点 其原因可能是堆被 ...
- Size Classes with Xcode 6:为所有的尺寸准备一个Storyboard
我最喜欢的Xcode6的特性是新的size classes 概念,有了它,我们解决了“我如何能够快速的为那么多不同尺寸屏幕以及方向的设备写app”.他们也让在一个storyboard中创建一个通用的a ...
- Dynamics CRM中的操作(action)是否是一个事务(transaction)?
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复168或者20151104可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 以前的博文 微软Dynamics ...
- play的action链(一个action跳转到另一个action,类似于重定向)
在play中没有Servlet API forward 的等价物.每一个HTTP request只能调用一个action.如果我们需要调用另一个,必须通过重定向,让浏览器访问另一个URL来访问它.这样 ...
- 一个action读取另一个action里的session
action 1: private Map session; session.put("projectname_session", request1.getParameter(&q ...
- checkbox复选框,如何让其勾选时触发一个事件,取消勾选时不触发
<input type="checkbox" onclick="checkboxOnclick(this)" /> <script> f ...
随机推荐
- [HEOI2015]小Z的房间 && [CQOI2018]社交网络
今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...
- 【js】项目中遇到的零星知识点
1.将进行url编码的json字符串转成json对象 在解析为json对象之前,要先用decodeURIComponent(str)来进行解码,然后这json串又变成了我们原先的json串了.然后我们 ...
- ①---Java开发环境配置
Java 开发环境配置 以下将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.c ...
- P1440 求m区间内的最小值--洛谷luogu
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- Java虚拟机垃圾收集器
一.判断对象存活的算法 1.引用计数(Reference Counting)算法 给对象添加一个引用计数器,每当有一个地方引用时,计数器加1.当引用失效时,计数器减1.当计数器的值为0的时候说该对象不 ...
- Vue.js 系列教程 2:组件,Props,Slots
原文:intro-to-vue-2-components-props-slots 译者:nzbin 这是关于 JavaScript 框架 Vue.js 五个教程的第二部分.在这一部分,我们将学习组件, ...
- .Net Core 在 Linux-Centos上的部署实战教程(一)
pa我是在VS2017上写好项目然后来部署的,我的宗旨能截图就少BB 服务器系统: Asp.Net Core版本: 1.往服务器安装.net core 2.1 https://www.microsof ...
- 使用protostuff自定义编解码器优化springcloud-feign性能
前言 Spring Cloud feign是伪RPC方式解决微服务间的调用.翻看FeignCloudFeign源码,可以看到Feign默认使用HttpUrlConnection; 代码在Default ...
- Hadoop重新格式化HDFS的方法
1.查看hdfs-site.xml: <property> <name>dfs.name.dir</name> <value>/home/hadoop/ ...
- 基于Tornado签名cookie源码设计API认证
想法1 服务端客户端个保存相同的一串字符串,客户端发送API请求时带着这段字符串来我服务端做校验,通过则返回相应数据,否则拒绝访问 弊端 黑客截取到请求信息,可直接会获取到该字符串,想服务端发送请求并 ...