WPF commands

WPF commands

commands 有點像 event,不同的是 event 是使用者的動作產生的,而 commands 跟使用者比較沒關係。WPF 提供了五大類的 commands:

1. ApplicationCommands: 像 Close, Copy, Cut, Paste, Delete...等。
2. ComponentCommands: 像 MoveDown, MoveLeft, ScrollPageDown...等。
3. MediaCommands: 像 DecreaseVolume, FastForward, MuteVolume...等。
4. NavigationCommands: 像 BrowseBack, BrowseForward, BrowseHome...等。
5. EditingCommands: 像 AlignCenter, AlignLeft, AlighRight...等。

上面的 commands 繼承自 RoutedUICommand。RoutedUICommand 還提供了 command bubbling 的功能,類似 routed event 中的 bubbling。

許多 control 都有提供 command 這個 property。我們可以用:

btn.Command = ApplicationCommand.Cut;

來將 Cut 設定給名稱為 btn 的 Button control。在 commands 中有一個 Text property,它的內容就是該 commands 常見的名稱。如對 Paste command,在中文作業系統就是 "貼上"。使用 Text property 可以做到多國語言的功能,名稱也比較統一。

而想要該 command binding 生效,還必需將 command 新增進 CommandBindings collection 中:

this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Help,
   HelpExecuted, HelpCanExecute));

CommandBinding class constructor 中第一個參數為要加入的 command,第二個是真正執行的 function,但是執不執行還要看第三個函式 HelpCanExecute。在 HelpCanExecute 中,要將 CanExecuteRoutedEventArgs 中的 CanExecute 設為 true,才代表該 command 可以被執行。

比如說 Cut command,如果使用者沒有選擇文字(或其它可剪下的物件)的話,CanExecute 就為 false。只有在有文字或物件被選擇的情況下,CanExecute 才為 true。

WPF 中定義了很多 input gesture。比如說 F1 就是執行 Help command;Ctrl+X 執行 Cut command 等。當然我們也可以自己定義:

this.InputBindings.Add(
   new KeyBinding(ApplicationCommands.Help, new KeyGesture(Key.F2)));

上例中將 F2 也對應到 Help command。如果要取消 WPF 預設 binding 的 command。可以:

this.InputBindings.Add(
   new KeyBinding(ApplicationCommands.NotACommand, new KeyGesture(Key.F1)));

上例中將原本對應到 F1 的 Help command 給取消了(ApplicationCommands.NotACommand)。

通常我們將 command binding 到 CommandBindings collection 之後,如果沒有客製化的 input gesture,就不必再做 input binding 的動作。像 Ctrl+C, Ctrl+V 等的 input gesture,已經被自動 binding 到 Copy, Paste command 上了。


留言

熱門文章