图形界面上可以有多重方式来执行同一个操作。比如可以通过图标按键,可以通过窗口菜单,可以通过右键菜单设置可以通过快捷键来执行“删除”这个操作。为了简化起见,XAML提供ICommand接口来抽象一个操作,供给不同的界面操作方式使用。

ICommand接口相当简单,只有两个方法:Execute和CanExecute。然后还定义了一个事件:CanExecuteChanged。就这么简单。

ICommand所在的命令空间是Windows.UI.Xaml.Input,这个命名空间下面还有XamlUICommandStandardUICommandXamlUICommand实现了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="&#x4D;"/>
            </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。

(本篇完)