当前位置: 首页 > news >正文

Blend中行为与Command

            本篇学习了Blend中的行为!并通过Command实现MVVM控制行为!

(一)基本概念:

1) 触发器Trigger: 是一种对象,该对象侦听特定条件(例如事件触发或属性设置为某个值),并调用一项或多项关联的 Actions 作为响应  
    (1)Blend内置触发器:DataStoreChangedTrigger、DataTrigger 、EventTrigger、KeyTrigger、PropertyChangedTrigger、StoryboardCompletedTrigger、TimerTrigger
    (2) Triggers 从 EventTrigger (在引发鼠标或键盘事件时触发 Action )到 CollisionTrigger (在两个对象彼此冲突时触发 Action )不尽相同。Triggers可以扩展,因此您可以创建出创意无限的自定义触发器

2) 操作(Action):是只能“执行” 某些操作的对象
    (1)Trigger 将调用 Invoke 方法,因此请确保希望 Action 执行的任何代码可采用 Invoke 方法内的某种形式进行访问
    (2)为了将 Action 的目标确定为另一个元素,请从 TargetedTriggerAction中扩展表示Action 的类
    (3)从TargetedTriggerAction 中扩展了类后,您将能够使用 TargetName 和 Target 属性访问目标元素

3) 行为(Behavior):
    (1)在没有来自 Trigger 或类似 Trigger 的项目的任何外部通知的情况下, Behavior 也可以执行。尽管必须满足某种条件,但它不必由 Trigger 调用
    (2扩展 Behavior 类,并将其约束为希望 Behavior 与之关联的类型)您可以将希望在以下条件下运行的任何代码放在 Behaviors 的 OnAttached 和 OnDetaching 方法中:将 Behavior 与对象关联时或将它从其当前关联的对象分离时
    (3)允许用户自定义行为功能的一种方式是公开 Commands (类型为 ICommand 的任何属性),其中每个命令都对应于 Behavior 可执行的一项操作
    (4)通过将 Triggers 添加到 Behavior 中,并让这些 Triggers 触发一个或多个 InvokeCommandActions .InvokeCommandAction 仅执行一项操作:调用 Behavior 公开的 Command

(二)    您可以使用三种类型的行为: Behavour、 TriggerAction 和 TargetedTriggerAction。如图:

(三)代码示例:实现的是取得鼠标移动时的位置。参考:http://www.cnblogs.com/888h/archive/2010/12/18/1910167.html

老外的文章:http://blog.roboblob.com/2010/01/26/binding-ui-events-from-view-to-commands-in-viewmodel-in-silverlight-4/

(1)添加一个行为:在Blend中添加新项。选择(Action)项

(2)在Action中代码如下(这里只写出主要代码):

代码
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( " Command " , typeof (ICommand), typeof (ExtendedInvokeCommandAction), new PropertyMetadata( null , CommandChangedCallback));
public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register( " CommandParameter " , typeof ( object ), typeof (ExtendedInvokeCommandAction), new PropertyMetadata( null , CommandParameterChangedCallback));
public ExtendedInvokeCommandAction()
{
// Insert code required on object creation below this point.
}
private static void CommandParameterChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var invokeCommand
= d as ExtendedInvokeCommandAction;
if (invokeCommand != null )
invokeCommand.SetValue(CommandParameterProperty, e.NewValue);
}
private static void CommandChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var invokeCommand
= d as ExtendedInvokeCommandAction;
if (invokeCommand != null )
invokeCommand.SetValue(CommandProperty, e.NewValue);
}

// 确保希望 Action 执行的任何代码可采用 Invoke 方法
protected override void Invoke( object parameter)
{
if ( this .Command == null )
return ;

if ( this .Command.CanExecute(parameter))
{
var commandParameter
= new ExtendedCommandParameter(parameter as EventArgs, this .AssociatedObject,
GetValue(CommandParameterProperty));
this .Command.Execute(commandParameter);
}
}
#region public properties

public object CommandParameter
{
get { return GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}

// 公开 Commands (类型为 ICommand 的任何属性)
public ICommand Command
{
get { return GetValue(CommandProperty) as ICommand; }
set { SetValue(CommandParameterProperty, value); }
}

#endregion
}

 

源代码下载

 

相关文章:

  • JSONP原理
  • 灭绝僵尸
  • HTTP 05 安全
  • ajax跨域jsonp及jquery中的调用问题
  • idea中git远程版本回退
  • Linux中查看系统版本的方法
  • 心有多大,微博就有多大!
  • 21.26 mongodb介绍
  • WPF入门(一):简单的演示
  • winSockets编程(三)最简单的C/S形式
  • 在 DLL工程中加入新 CFormView时的 注意事项
  • 网络问题排查
  • 游戏中汉字显示的实现与技巧[ZZ]
  • 源码探探之StartActivity(一)
  • 《见与不见》
  • 网络传输文件的问题
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Codepen 每日精选(2018-3-25)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HTTP--网络协议分层,http历史(二)
  • V4L2视频输入框架概述
  • 编写高质量JavaScript代码之并发
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 入手阿里云新服务器的部署NODE
  • 思维导图—你不知道的JavaScript中卷
  • 微服务入门【系列视频课程】
  • 用jquery写贪吃蛇
  • Nginx实现动静分离
  • 组复制官方翻译九、Group Replication Technical Details
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1)(1.11) SiK Radio v2(一)
  • (33)STM32——485实验笔记
  • (6)STL算法之转换
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转)iOS字体
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET : 在VS2008中计算代码度量值
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core 版本不支持的问题
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET企业级应用架构设计系列之开场白
  • @angular/cli项目构建--Dynamic.Form
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BROADCASTING]tensor的扩散机制
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BUUCTF 2018]Online Tool(特详解)
  • [C#基础]说说lock到底锁谁?
  • [hdu1561] The more, The Better 【树形DP】