次の方法で共有


キーボード アクセラレータ

キーボード アクセラレータは、Mac Catalyst および Windows 上の .NET マルチプラットフォーム アプリ UI (.NET MAUI) アプリの使いやすさとアクセシビリティを向上させるキーボード ショートカットです。ユーザーは、アプリ UI を直接移動することなく、一般的なアクションやコマンドを直感的に呼び出すことができます。

キーボード アクセラレータは、次の 2 つのコンポーネントで構成されます。

  • Shift、Ctrl、Alt を含む修飾子。
  • キー。英数字キーと特殊キーがあります。

.NET MAUI では、キーボード アクセラレータはメニューで公開されているコマンドに関連付けられているので、メニュー項目で指定する必要があります。 具体的には、.NET MAUI キーボード アクセラレータは、Mac Catalyst と Windows のメニュー バーのメニュー項目と、Windows のコンテキスト メニューのメニュー項目にアタッチできます。 メニュー バーの詳細については、「.NET MAUI デスクトップ アプリでメニュー バーを表示する」をご覧ください。 コンテキスト メニューの詳細については、「.NET MAUI デスクトップ アプリでコンテキスト メニューを表示する」をご覧ください。

次のスクリーンショットは、キーボード アクセラレータを含むメニュー バー項目とコンテキスト メニュー項目を示しています。

Screenshot of menu bar items that include keyboard accelerators.Screenshot of context menu items that include keyboard accelerators.

キーボード アクセラレータは、KeyboardAccelerator クラスによって表され、MenuFlyoutItem のショートカット キーを表しています。 KeyboardAccelerator クラスでは、次のプロパティが定義されます。

  • Modifiers (KeyboardAcceleratorModifiers 型) は、キーボード ショートカットの修飾キーの値 (Ctrl や Shift など) を表します。
  • Key (string? 型) は、キーボード ショートカットのキー値を表します。

これらのプロパティは BindableProperty オブジェクトがサポートしています。そのため、これらのプロパティはデータ バインディングの対象にできます。

KeyboardAcceleratorModifiers 列挙型は、Modifiers プロパティの値として使用される次のメンバーを定義します。

  • None は、修飾キーを使用しないことを示します。
  • Shift は、Mac Catalyst と Windows の Shift 修飾キーを示します。
  • Ctrl は、Mac Catalyst と Windows の Control 修飾キーを示します。
  • Alt は、Mac Catalyst の Option 修飾キーと Windows のメニュー修飾キーを示します。
  • Cmd は、Mac Catalyst の Command 修飾キーを示します。
  • Windows は、Windows の Windows 修飾キーを示します。

重要

キーボード アクセラレータは、Mac Catalyst と Windows では MenuBarItem 内の MenuFlyoutItem オブジェクトに、Windows では MenuFlyoutオブジェクトにアタッチできます。

次の表は、.NET MAUI でサポートされるキーボード アクセラレータ形式の概要を示しています。

プラットフォーム 単一キー 複数キー
Mac Catalyst 単一キーを使用し、修飾キーを使用しないキーボード アクセラレータ。 たとえば、F1 キーを使用して、メニュー項目に関連付けられているアクションを呼び出します。 単一キーとともに、1 つ以上の修飾キーを使用するキーボード アクセラレータ。 たとえば、CMD + Shift + S または CMD + S を使用して、メニュー項目に関連付けられているアクションを呼び出します。
Windows 単一キーと修飾キーを使用する、または単一キーを使用して修飾キーを使用しないキーボード アクセラレータ。 たとえば、F1 キーを使用して、メニュー項目に関連付けられているアクションを呼び出します。 単一キーとともに、1 つ以上の修飾キーを使用するキーボード アクセラレータ。 たとえば、Ctrl + Shift + F または Ctrl + F キーを使用して、メニュー項目に関連付けられているアクションを呼び出します。

キーボード アクセラレータを作成する

KeyboardAccelerator は、KeyboardAccelerators コレクションに追加することで、MenuFlyoutItem にアタッチできます

<MenuFlyoutItem Text="Cut"
                Clicked="OnCutMenuFlyoutItemClicked">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Ctrl"
                             Key="X" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

キーボード アクセラレータは、コードで指定することもできます。

cutMenuFlyoutItem.KeyboardAccelerators.Add(new KeyboardAccelerator
{
    Modifiers = KeyboardAcceleratorModifiers.Ctrl,
    Key = "X"
});

キーボード アクセラレータの修飾キーとキーを押すと、MenuFlyoutItem に関連付けられているアクションが呼び出されます。

重要

複数の KeyboardAccelerator オブジェクトを MenuFlyoutItem.KeyboardAccelerators コレクションに追加できますが、コレクション内の最初の KeyboardAccelerator のみ、MenuFlyoutItem にショートカットが表示されます。 さらに、Mac Catalyst では、コレクション内の最初の KeyboardAccelerator キーボード ショートカットのみが、MenuFlyoutItem に関連付けられているアクションを呼び出します。 ただし、Windows では、MenuFlyoutItem.KeyboardAccelerators コレクション内のすべての KeyboardAccelerator オブジェクトのキーボード ショートカットによって MenuFlyoutItem アクションが呼び出されます。

複数の修飾キーを指定する

両方のプラットフォームで、KeyboardAccelerator に複数の修飾キーを指定できます。

<MenuFlyoutItem Text="Refresh"
                Command="{Binding RefreshCommand}">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Shift,Ctrl"
                             Key="R" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

同等の C# コードを次に示します。

refreshMenuFlyoutItem.KeyboardAccelerators.Add(new KeyboardAccelerator
{
    Modifiers = KeyboardAcceleratorModifiers.Shift | KeyboardAcceleratorModifiers.Ctrl,
    Key = "R"
});

プラットフォームごとにキーボード アクセラレータを指定する

XAML では、OnPlatform マークアップ拡張機能を使用して、プラットフォームごとに異なるキーボード アクセラレータの修飾キーとキーを指定できます。

<MenuFlyoutItem Text="Change Theme"
                Command="{Binding ChangeThemeCommand}">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="{OnPlatform MacCatalyst=Cmd, WinUI=Windows}"
                             Key="{OnPlatform MacCatalyst=T, WinUI=C}" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

同等の C# コードを次に示します。

KeyboardAcceleratorModifiers modifier = KeyboardAcceleratorModifiers.None;
string key = string.Empty;

if (DeviceInfo.Current.Platform == DevicePlatform.MacCatalyst)
{
    modifier = KeyboardAcceleratorModifiers.Cmd;
    key = "T";
}
else if (DeviceInfo.Current.Platform == DevicePlatform.WinUI)
{
    modifier = KeyboardAcceleratorModifiers.Windows;
    key = "C";
}

myMenuFlyoutItem.KeyboardAccelerators.Add(new KeyboardAccelerator
{
    Modifiers = modifier,
    Key = key
});

キーボード アクセラレータで特殊キーを使用する

Windows では、文字列定数または整数を使用して特殊キーを指定できます。 定数と整数の一覧については、VirtualKey の表をご覧ください。

Note

Windows では、単一キー アクセラレータ (すべての英数字と句読点キー、Delete、F2、Spacebar、Esc、マルチメディア キー) とマルチキー アクセラレータ (Ctrl + Shift + M) がサポートされています。 ただし、ゲームパッドの仮想キーはサポートされていません。

Mac Catalyst では、文字列定数を使用して特殊キーを指定できます。 特殊キーに対応するテキスト入力文字列を表す定数の一覧については、developer.apple.com の「Input strings for special keys」をご覧ください。

次の XAML は、特殊なキーを使用するキーボード アクセラレータを定義する例を示しています。

<MenuFlyoutItem Text="Help"
                Command="{Binding HelpCommand}">
    <MenuFlyoutItem.KeyboardAccelerators>
        <!-- Alternatively, 112 can be used to specify F1 on Windows -->
        <KeyboardAccelerator Modifiers="None"
                             Key="{OnPlatform MacCatalyst=UIKeyInputF1, WinUI=F1}" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

この例では、キーボード アクセラレータは F1 キーであり、両方のプラットフォームで定数を使用して指定されています。 Windows では、整数 112 で指定することもできます。

キーボード アクセスレータをローカライズする

キーボード アクセラレータ キーは、.NET リソース ファイルを使用してローカライズできます。 ローカライズされたキーは、x:Static マークアップ拡張機能を使用して取得できます。

<MenuFlyoutItem Text="Cut"
                Clicked="OnCutMenuFlyoutItemClicked">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Ctrl"
                             Key="{x:Static local:AppResources.CutAcceleratorKey}" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

詳細については、「ローカリゼーション」を参照してください。

キーボード アクセラレータを無効にする

MenuFlyoutItem を無効にすると、関連付けられているキーボード アクセラレータも無効になります。

<MenuFlyoutItem Text="Cut"
                Clicked="OnCutMenuFlyoutItemClicked"
                IsEnabled="false">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Ctrl"
                             Key="X" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

この例では、MenuFlyoutItemIsEnabled プロパティが false に設定されているため、関連付けられている CTRL+X キーボード アクセラレータを呼び出すことはできません。