图形界面上可以有多重方式来执行同一个操作。比如可以通过图标按键,可以通过窗口菜单,可以通过右键菜单设置可以通过快捷键来执行“删除”这个操作。为了简化起见,XAML提供ICommand接口来抽象一个操作,供给不同的界面操作方式使用。
ICommand接口相当简单,只有两个方法:Execute和CanExecute。然后还定义了一个事件:CanExecuteChanged。就这么简单。
ICommand所在的命令空间是Windows.UI.Xaml.Input,这个命名空间下面还有XamlUICommand和StandardUICommand。XamlUICommand实现了ICommand,而StandardUICommand则是从XamlUICommand派生出来的。
可以通过XamlUICommand的Command部属来获取其实现的ICommand接口。
顾名思义,XamlUICommand可以在XAML中使用:
<XamlUICommand x:Name="CustomXamlUICommand"
ExecuteRequested="DeleteCommand_ExecuteRequested"
Description="Custom XamlUICommand"
Label="Custom XamlUICommand">
<XamlUICommand.IconSource>
<FontIconSource FontFamily="Wingdings" Glyph="M"/>
</XamlUICommand.IconSource>
<XamlUICommand.KeyboardAccelerators>
<KeyboardAccelerator Key="D" Modifiers="Control"/>
</XamlUICommand.KeyboardAccelerators>
</XamlUICommand>
XamlUICommand新增了两个事件:CanExecuteRequested和ExecuteRequested,分别在CanExecute和Execute调用之后触发。暂时看不出来这两个事件有什么作用。另外其增加了一个方法NotifyCanExecuteChanged,用来通告事件ExecuteRequested。
XamlUICommand新增了若干部属:
- AccessKey,用来定义访问键
- Description,用来定义相关的描述
- IconSource,用来定义Segoe MDL2中的图标glyph
- KeyboardAccelerators,用来定义快捷键
StandardUICommand则实现了一套平台通用的ICommand接口,包括:
- Cut/Copy/Paste
- Select All
- Delete
- Share
- Save/Open/Close
- Pause/Play/Stop
- Forward/Backward
- Undo/Redo
上面这些都在[StandardUICommandKind]中定义。可以在StandardUICommand创建的时候传入所需命名的类型,也可以在 StandardUICommand.Kind中指定。
Commanding in Windows apps using StandardUICommand, XamlUICommand, and ICommand列举了许多例子可供参考,主要介绍了怎么通过Swipe,快捷键、关联菜单、还有鼠标悬停来操作同一个命令。
XamlUICommand至少需要Windows 1809。
(本篇完)