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. 界面定义和绑定命令:
2. 后台代码实现:
有此,可以看到,使用命令大大简化了事件和方法的书写,简单明了。
而且,WPF为我们提供了大量内置命令,包括ApplicationCommands,NavigationCommands,,MediaCommands,EditingCommands与ComponentCommands,以及控件开发人员为它们的控件也提供了很多特有的命令(比如Slider.DecreaseLarge 与 Slider.DecreaseSmall),这些足以应付平时的大多数应用,如果还不够的话,你可以为自己的应用自定义更多的命令。
自定义命令需要在后台代码里定义好命令,代码如下:
页面代码也有所不同,代码如下:
当然,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的命令系统是非常庞大和复杂的,更多的应用还需根据实际情况不断摸索。有兴趣的可以一起讨论。
相关文章推荐
- WPF命令(Command)介绍、命令和数据绑定集成应用
- WPF命令(Command)介绍、命令和数据绑定集成应用
- C# WPF TextBox绑定数据的简单应用
- win7的bcdedit简单应用 用来删除多余启动项的命令
- WPF中使用MVVM模式进行简单的数据绑定
- WPF中DataGrid的ComboBox的简单绑定方式(绝对简单)
- WPF学习系列032: 3.4.3 带有内建命令绑定的控件
- 鸟哥的Linux私房菜:首次登陆与在线求助,LINUX最简单的命令及应用(一)
- 华为交换机简单配置命令(华为 vlan arp绑定 端口镜像)
- WPF数据绑定(1-简单数据绑定)
- WPF中的命令与命令绑定(二)
- c#编译 --csc命令的简单应用
- dataGridView没有绑定数据库时的简单应用学习小结
- WPF Prism框架下基于MVVM模式的命令、绑定、事件
- 个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 1
- WPF中的命令与命令绑定(二)
- 解析WPF绑定层次结构数据的应用详解
- WPF中的EventTrigger和命令绑定
- WPF中的EventTrigger和命令绑定
- WPF元素绑定--简单