您的位置:首页 > 其它

WPF 命令绑定简单应用

2010-09-14 16:34 363 查看
UI交互时,很多功能都是有不同的入口来实现,例如:复制、粘贴等。早期winform编程的时候一般都是通过抽取方法,然后事件调用方法来实现代码复用。WPF提供了命令这一模式来实现这一应用 - 一功能、多入口。

WPF的一个命令系统是被分为四个部分:

1. Command(命令):一个语义级别的输入,比如“复制”等;

2. CommandSource(命令源):引发某命令的元素,比如按钮,菜单项,键盘(Ctrl-C,F1等),鼠标等;

3. CommandTarget(命令目标):命令被作用的目标,比如文本框,播放器等;

4. CommandBinding(命令绑定):用于将命令和命令的处理逻辑链接起来,比如同样的"粘贴",但粘贴文本和粘贴图片的处理逻辑是不一样的,命令绑定负责将“粘贴”命令与合理的处理逻辑连接起来。

其中,命令源是由引发命令的元素实现的,在WPF现有的控件中,如:MenuItem、ButtonBase等。而命令目标是由接收命令的元素实现,使用时属于非必须项。

下面是个简单的例子:

1. 界面定义和绑定命令:

<!--窗口命令绑定定义-->
<Window.CommandBindings>
<CommandBinding Command="Undo"
CanExecute="CommandBinding_Undo_CanExecute"
Executed="CommandBinding_Undo_Execute"/>
<CommandBinding Command="Redo"
CanExecute="CommandBinding_Redo_CanExecute"
Executed="CommandBinding_Redo_Execute"/>
<CommandBinding Command="Zoom"
Executed="CommandBinding_Zoom_Execute"/>
</Window.CommandBindings>

<!--窗口输入命令绑定定义-->
<Window.InputBindings>
<KeyBinding Command="Undo" Key="Z" Modifiers="Control" />
<KeyBinding Command="Redo" Key="Y" Modifiers="Control" />
</Window.InputBindings>


<Menu x:Name="TopMenu"  DockPanel.Dock="Top" >
<MenuItem x:Name="MenuEditItem" Header="编 辑">
<MenuItem x:Name="MenuUndoItem" Header="撤 销" Command="Undo" />
<MenuItem x:Name="MenuRedoItem" Header="重 做" Command="Redo" />
</MenuItem>
</Menu>
<!--窗口底部菜单-->
<Menu x:Name="BottomMenu" DockPanel.Dock="Bottom">
<!--画板缩放菜单-->
<MenuItem x:Name="MenuZoomItem" Header="缩放比例:100%">
<MenuItem Header="50%" Command="Zoom" CommandParameter="50" />
<MenuItem Header="75%" Command="Zoom" CommandParameter="75" />
<MenuItem Header="100%" Command="Zoom" CommandParameter="100" />
<MenuItem Header="120%" Command="Zoom" CommandParameter="120" />
<MenuItem Header="150%" Command="Zoom" CommandParameter="150" />
<MenuItem Header="200%" Command="Zoom" CommandParameter="200" />
<MenuItem Header="300%" Command="Zoom" CommandParameter="300" />
<MenuItem Header="400%" Command="Zoom" CommandParameter="400" />
<MenuItem Header="500%" Command="Zoom" CommandParameter="500" />
</MenuItem>
</Menu>


2. 后台代码实现:

#region Window Command
/// <summary>
/// 可否执行撤销命令判断
/// </summary>
/// <param name="sender">Command</param>
/// <param name="e">event arg</param>
private void CommandBinding_Undo_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (null == this.diagram.UndoManager.History.NextUndo)
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
}
/// <summary>
/// 执行撤销命令
/// </summary>
/// <param name="sender">Command</param>
/// <param name="e">event arg</param>
private void CommandBinding_Undo_Execute(object sender, ExecutedRoutedEventArgs e)
{
this.diagram.UndoManager.Undo();
}
/// <summary>
/// 可否执行重做命令判断
/// </summary>
/// <param name="sender">Command</param>
/// <param name="e">event arg</param>
private void CommandBinding_Redo_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (null == this.diagram.UndoManager.History.NextRedo)
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
}
/// <summary>
/// 执行重做命令
/// </summary>
/// <param name="sender">Command</param>
/// <param name="e">event arg</param>
private void CommandBinding_Redo_Execute(object sender, ExecutedRoutedEventArgs e)
{
this.diagram.UndoManager.Redo();
}
/// <summary>
/// 执行缩放命令
/// </summary>
/// <param name="sender">Command</param>
/// <param name="e">event arg</param>
private void CommandBinding_Zoom_Execute(object sender, ExecutedRoutedEventArgs e)
{
float zoomValue = float.Parse(e.Parameter.ToString());
this.view.ZoomFactor = zoomValue;
this.MenuZoomItem.Header = "缩放比例:" + zoomValue + "%"; //Hard code in here
}
#endregion


有此,可以看到,使用命令大大简化了事件和方法的书写,简单明了。

而且,WPF为我们提供了大量内置命令,包括ApplicationCommands,NavigationCommands,,MediaCommands,EditingCommands与ComponentCommands,以及控件开发人员为它们的控件也提供了很多特有的命令(比如Slider.DecreaseLarge 与 Slider.DecreaseSmall),这些足以应付平时的大多数应用,如果还不够的话,你可以为自己的应用自定义更多的命令。

自定义命令需要在后台代码里定义好命令,代码如下:

#region Command

/// <summary>
/// 新增流程模板分类命令
/// </summary>
public static readonly RoutedUICommand AddCatalog = new RoutedUICommand();

/// <summary>
/// 编辑流程模板分类命令
/// </summary>
public static readonly RoutedUICommand EditCatalog = new RoutedUICommand();

/// <summary>
/// 删除流程模板分类命令
/// </summary>
public static readonly RoutedUICommand DeleteCatalog = new RoutedUICommand();

#endregion


页面代码也有所不同,代码如下:

<!--命令绑定-->
<Window.CommandBindings>
<!-- bindings for context menu commands -->
<CommandBinding Command="local:WorkflowManagementWindow.AddCatalog"
CanExecute="EvaluateCanAddCatalog"
Executed="ExcuteAddCatalog" />

<CommandBinding Command="local:WorkflowManagementWindow.EditCatalog"
CanExecute="EvaluateCanEditCatalog"
Executed="ExcuteEditCatalog" />

<CommandBinding Command="local:WorkflowManagementWindow.DeleteCatalog"
CanExecute="EvaluateCanDeleteCatalog"
Executed="ExcuteDeleteCatalog" />
</Window.CommandBindings>


当然,WPF的命令系统是非常庞大和复杂的,更多的应用还需根据实际情况不断摸索。有兴趣的可以一起讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: