说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。
WPF内建的命令表示与用于界面分离的动作,标准的命令如剪切(Cut),复制(Copy)和粘贴(Paste)等。这些命令常被用于Menu及ContentMenu控件的MenuItem,ToolBar中的Button按钮与键盘的快捷方式等。
有了命令可以很方便的把一个事件及其相应的事件处理程序绑定到一个元素。而且命令可以自动通知元素的UI当前命令是否可用。WPF定义了许多内建命令,且这些命令自动支持键盘快捷键。
命令的本质
命令是任何一个实现了System.Windows.Input命名空间下ICommand接口的对象,这个对象定义了3个简单的成员:
-
Excute:执行特定命令的逻辑的方法。
-
CanExcute:如果命令允许被执行,则该方法返回true,否则返回false。
-
CanExcuteChanged:只要CanExcute的值改变,该事件就会触发。
命令的设计与使用
当你需要设计一个命令时,你只要创建一个继承ICommand接口的类,并实现其中的方法。然后你就可以将此命令指定给需要的元素。
对于像Button,CheckBox和MenuItem等控件,其在设计时定义了一个ICommand类型的Command属性。你可以将自定义的Command指定给这个属性。这之后当Click事件触发时,这些控件就会自动调用设置给其的命令对象的Excute方法(在CanExcute返回true时),同时CanExcuteChanged事件保证控件的IsEnabled值与命令的CanExcute的值同步。
通过这种属性赋值的方式设置命令更适合XAML来实现。
对于不支持Command属性的控件,为其应用命令稍微复杂些。首先手动处理控件的事件在其中调用Excute()方法,并自己处理CanExcuteChanged事件,在其中同步IsEnabled与CanExcuted的值。
WPF的内建命令
WPF中定义了五类内建命令,分别作为静态属性定义于五个类中。
所属类 | 命令 |
ApplicationCommands | Close、Copy、Cut、Delete、Find、Help、New、Open、Paste、Print、PrintPreview、Properties、Redo、Replace、Save、SaveAs、SelectAll、Stop、Undo等 |
ComponentCommands | MoveDown、MoveLeft、MoveRight、MoveUp、ScrollByLine、ScrollPageDown、ScrollPageLeft、ScrollPageRight、ScrollPageUp、SelectToEnd、SelectToHome、SelectToPageDown、SelectToPageUp等 |
MediaCommands | ChannelDown、ChannelUp、DecreaseVolume、FastForward、IncreaseVolume、MuteVolume、NextTrack、Pause、Play、PreviousTrack、Record、Rewind、Select、Stop等 |
NavigationCommands | BrowseBack、BrowseForward、BrowseHome、BrowseStop、Favorites、FirstPage、GoToPage、LastPage、NextPage、PreviousPage、Refresh、Search、Zoom等 |
EditingCommands | AlignCenter、AlignJustify、AlignLeft、AlignRight、Correct- SpellingError、DecreaseFontSize、DecreaseIndentation、EnterLineBreak、EnterParag- raphBreak、IgnoreSpellingError、IncreaseFontSize、IncreaseIndentation、MoveDown- ByLine、MoveDownByPage、MoveDownByParagraph、MoveLeftByCharacter、MoveLeftByWord、MoveRightByCharacter、MoveRightByWord等 |
这些内置的Command均为RoutedUICommand类型,这样其同时具有了命令与路由事件的双重特性。其还具有一个Text属性,其包含命令的名称,且这些名称支持本地化。为了让指定到元素的内嵌命令知道在什么时候启用,及执行哪些动作。需要自定义这个逻辑 – 向元素(或其父元素)中添加一个CommandBinding对象。
下面分别用C#与XAML来展示这个过程:
这两种方法前提是HelpCanExecute与HelpExecuted方法被定义,可以参考如下实现:
void HelpCanExcute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true;//保持命令在启用状态 } void HelpExecuted(object sender, ExecutedRoutedEventArgs e) { System.Diagnostics.Process.Start("http://www.cnblogs.com/lsxqw2004"); }
通过以上代码就可以实现将命令及其处理方式与控件相关联。
将命令与快捷键相关联的方式,以Help命令与F1相关联来演示:
使用C#代码设置:
this.InputBindings.Add(new KeyBinding(ApplicationCommands.Help, new KeyGesture(Key.F1)));
使用XAML代码设置:
<Window.InputBindings> <InputBinding Command="Help" Key="F1"/> </Window.InputBindings>
本文完
参考:
《WPF揭秘》