ApplicationCommandsクラスではアプリケーションでよく使われる、「ファイルを開く」や「保存する」など、
標準的なコマンドを提供します。
プロパティの型はRoutedUICommandでICommandの実装です。
ICommandは実際の処理をICommandのインスタンスと紐づけ、実際の処理を直接実行するのではなくICommand経由で行います。
そうすることで、ICommandの機能で、コマンドの実行の可否をコントロールできたり、実際の処理を入れ替えることが出来るなどメリットがあります。
通常ICommandは実際の処理の定義と同時に使うことが多くApplicationCommandsのような単体としての使い方は、あまり馴染みが少ない感じがします。
- CancelPrint
- 印刷中止コマンドを表す値を取得します。
- Close
- 終了コマンドを表す値を取得します。
- ContextMenu
- コンテキスト メニュー コマンドを表す値を取得します。
- Copy
- Copy コマンドを表す値を取得します。
- CorrectionList
- 修正候補の一覧コマンドを表す値を取得します。
- Cut
- 切り取りコマンドを表す値を取得します。
- Delete
- 削除コマンドを表す値を取得します。
- Find
- 検索コマンドを表す値を取得します。
- Help
- ヘルプ コマンドを表す値を取得します。
- New
- 新規作成コマンドを表す値を取得します。
- NotACommand
- 常に無視されるコマンドを表します。
- Open
- 開くコマンドを表す値を取得します。
- Paste
- 貼り付けコマンドを表す値を取得します。
- 印刷コマンドを表す値を取得します。
- PrintPreview
- 印刷プレビュー コマンドを表す値を取得します。
- Properties
- プロパティ コマンドを表す値を取得します。
- Redo
- やり直しコマンドを表す値を取得します。
- Replace
- Replace コマンドを表す値を取得します。
- Save
- 保存コマンドを表す値を取得します。
- SaveAs
- 名前を付けて保存コマンドを表す値を取得します。
- SelectAll
- [すべて選択] コマンドを表す値を取得します。
- Stop
- 停止コマンドを表す値を取得します。
- Undo
- 元に戻すコマンドを表す値を取得します。
もしApplicationCommandsに妥当なコマンドがない場合オリジナルコマンドを作ることも出来ます。
using System.Windows.Input;
public static class MyAppCommands
{
// 例:画像を書き出す
public static readonly RoutedUICommand ExportImage =
new RoutedUICommand(
"Export Image", // UI 表示名
"ExportImage", // コマンド識別名
typeof(MyAppCommands) // 所属
);
// 例:最近使ったファイルを再読み込み
public static readonly RoutedUICommand ReloadLastFile =
new RoutedUICommand(
"Reload Last File",
"ReloadLastFile",
typeof(MyAppCommands)
);
// 例:表示倍率をリセット
public static readonly RoutedUICommand ResetZoom =
new RoutedUICommand(
"Reset Zoom",
"ResetZoom",
typeof(MyAppCommands)
);
// 例:アプリ独自のトグル動作
public static readonly RoutedUICommand ToggleGrid =
new RoutedUICommand(
"Toggle Grid",
"ToggleGrid",
typeof(MyAppCommands)
);
}
利用例
以下のコードはキーバインディングを行うヘルパーのコードですが、
ApplicationCommands.Openに、
Ctrl+Oキーをキーバンドし、
OpenByDalog()を呼び出す、
定義を行っています。
Hotkeys.cs
using System.Windows;
using System.Windows.Input;
static class Hotkeys
{
public static void Add(Window w, ICommand cmd, Key key, ModifierKeys mods,
ExecutedRoutedEventHandler exec, CanExecuteRoutedEventHandler? can = null)
{
w.CommandBindings.Add(
new CommandBinding(cmd, exec, can ?? ((_, e) => e.CanExecute = true)));
w.InputBindings.Add(
new KeyBinding(cmd, key, mods));
}
}
MainWindow.xaml.cs(抜粋)
// ホットキー(コンストラクタでキーバインドの定義)
Hotkeys.Add(this, ApplicationCommands.Open, Key.O, ModifierKeys.Control,
(_, __) => OpenByDialog());
Ctrl+Oキーのイベントで直接OpenByDialog()を呼び出せば良さそうなものですが、WPFのバインディングシステムに敬意を評して、ICommandを使うようにします。

コメント