ApplicationCommands クラスの使い方を確認する

コンピュータ

ApplicationCommandsクラスではアプリケーションでよく使われる、「ファイルを開く」や「保存する」など、
標準的なコマンドを提供します。

プロパティの型はRoutedUICommandでICommandの実装です。
ICommandは実際の処理をICommandのインスタンスと紐づけ、実際の処理を直接実行するのではなくICommand経由で行います。
そうすることで、ICommandの機能で、コマンドの実行の可否をコントロールできたり、実際の処理を入れ替えることが出来るなどメリットがあります。

通常ICommandは実際の処理の定義と同時に使うことが多くApplicationCommandsのような単体としての使い方は、あまり馴染みが少ない感じがします。

CancelPrint
印刷中止コマンドを表す値を取得します。
Close
終了コマンドを表す値を取得します。
ContextMenu
コンテキスト メニュー コマンドを表す値を取得します。
Copy
Copy コマンドを表す値を取得します。
CorrectionList
修正候補の一覧コマンドを表す値を取得します。
Cut
切り取りコマンドを表す値を取得します。
Delete
削除コマンドを表す値を取得します。
Find
検索コマンドを表す値を取得します。
Help
ヘルプ コマンドを表す値を取得します。
New
新規作成コマンドを表す値を取得します。
NotACommand
常に無視されるコマンドを表します。
Open
開くコマンドを表す値を取得します。
Paste
貼り付けコマンドを表す値を取得します。
Print
印刷コマンドを表す値を取得します。
PrintPreview
印刷プレビュー コマンドを表す値を取得します。
Properties
プロパティ コマンドを表す値を取得します。
Redo
やり直しコマンドを表す値を取得します。
Replace
Replace コマンドを表す値を取得します。
Save
保存コマンドを表す値を取得します。
SaveAs
名前を付けて保存コマンドを表す値を取得します。
SelectAll
[すべて選択] コマンドを表す値を取得します。
Stop
停止コマンドを表す値を取得します。
Undo
元に戻すコマンドを表す値を取得します。
― 出典: Microsoft Learn 「System.Windows.Input.ApplicationCommands」

もし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を使うようにします。

コメント