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
(1)添加一个行为:在Blend中添加新项。选择(Action)项
(2)在Action中代码如下(这里只写出主要代码):
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
}