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

Surface キーボード

アクセラレータ キー (キーボード アクセラレータ) は、アプリの UI 間を移動せずに一般的な操作やコマンドを呼び出すための直感的な方法をユーザーに提供して、Windows アプリケーションの使いやすさとアクセシビリティを向上させるキーボード ショートカットです。Accelerator keys (or keyboard accelerators) are keyboard shortcuts that improve the usability and accessibility of your Windows applications by providing an intuitive way for users to invoke common actions or commands without navigating the app UI.

キーボード ショートカットを使って Windows アプリケーションの UI に移動する方法について詳しくは、「アクセス キー 」をご覧ください。See the Access keys topic for details on navigating the UI of a Windows application with keyboard shortcuts.

注意

キーボードは、特定の障碍を持つユーザーにとっては不可欠であり (キーボードのアクセシビリティをご覧ください)、アプリをより効率的に操作することを望むユーザーにとって重要なツールでもあります。A keyboard is indispensable for users with certain disabilities (see Keyboard accessibility), and is also an important tool for users who prefer it as a more efficient way to interact with an app.

概要Overview

通常、アクセラレータには F1 から F12 までのファンクション キーや、標準キーと 1 つ以上の修飾キー (Ctrl、Shift など) の組み合わせが含まれます。Accelerators typically include the function keys F1 through F12 or some combination of a standard key paired with one or more modifier keys (CTRL, Shift).

注意

UWP プラットフォームのコントロールには、組み込みのキーボード アクセラレータが用意されています。The UWP platform controls have built-in keyboard accelerators. たとえば、ListView では Ctrl + A (一覧のすべての項目を選択する) がサポートされ、RichEditBox では Ctrl + Tab (テキスト ボックスにタブを挿入する) がサポートされています。For example, ListView supports Ctrl+A for selecting all the items in the list, and RichEditBox supports Ctrl+Tab for inserting a Tab in the text box. これらの組み込みキーボード アクセラレータは、コントロール アクセラレータと呼ばれ、要素またはその子にフォーカスがある場合にのみ実行されます。These built-in keyboard accelerators are referred to as control accelerators and are executed only if the focus is on the element or one of its children. ここで説明するキーボード アクセラレータ API を使用して定義するアクセラレータは、アプリ アクセラレータと呼ばれます。Accelerators defined by you using the keyboard accelerator APIs discussed here are referred to as app accelerators.

キーボード アクセラレータは、すべてのアクションに用意されるのではなく、多くの場合はメニューで公開されているコマンドに関連付けられています (メニュー項目コンテンツにも示されています)。Keyboard accelerators are not available for every action but are often associated with commands exposed in menus (and should be specified with the menu item content). アクセラレータは、対応するメニュー項目がない操作に関連付けることもできます。 Accelerators can also be associated with actions that do not have equivalent menu items. ただし、ユーザーはアプリケーションのメニューを使用して、利用可能なコマンド セットを見つけ、その機能を理解するため、アクセラレータができるだけ簡単に検出されるようにする必要があります (ラベルの使用や、決まったパターンの使用が役立ちます)。However, because users rely on an application's menus to discover and learn the available command set, you should try to make discovery of accelerators as easy as possible (using labels or established patterns can help with this).

メニュー項目のラベルで説明されているキーボード アクセラレータKeyboard accelerators described in a menu item label
メニュー項目のラベルで説明されているキーボード アクセラレータKeyboard accelerators described in a menu item label

キーボード アクセラレータの使用に適したケースWhen to use keyboard accelerators

UI に適切な場合は必ずキーボード アクセラレータを指定し、すべてのカスタム コントロールでアクセラレータをサポートすることをお勧めします。We recommend that you specify keyboard accelerators wherever appropriate in your UI, and support accelerators in all custom controls.

  • キーボード アクセラレータより使いやすく、アプリ、一度に 1 つのキーを押してしたり、苦労 mouse.* * を使用してユーザーを含む、自動車の障碍を持つユーザーKeyboard accelerators make your app more accessible for users with motor disabilities, including those users who can press only one key at a time or have difficulty using a mouse.**

    適切に設計されたキーボード UI はソフトウェアのアクセシビリティの重要な要素であり、A well-designed keyboard UI is an important aspect of software accessibility. 視覚に障碍のあるユーザーや特定の運動障碍のあるユーザーによるアプリ内の移動や、その機能の操作を実現します。It enables users with vision impairments or who have certain motor disabilities to navigate an app and interact with its features. このようなユーザーはマウスを操作できない場合があるため、代わりにさまざまな支援技術 (キーボード強化ツール、スクリーン キーボード、スクリーン拡大機能、スクリーン リーダー、音声入力ユーティリティなど) が不可欠になる可能性があります。Such users might not be able to operate a mouse and instead rely on various assistive technologies such as keyboard enhancement tools, on-screen keyboards, screen enlargers, screen readers, and voice input utilities. このようなユーザーにとっては、コマンドを包括的にカバーすることが重要です。For these users, comprehensive command coverage is crucial.

  • キーボード アクセラレータでは、パワー ユーザーがキーボードから操作する場合により使いやすく、アプリを作成します。Keyboard accelerators make your app more usable for power users who prefer to interact through the keyboard.

    多くの経験豊富なユーザーには、キーボードの使用の方がはるかに好まれます。キーボード ベースのコマンドであれば、すばやく入力することができ、キーボードから手を離す必要がないためです。Experienced users often have a strong preference for using the keyboard because keyboard-based commands can be entered more quickly and don't require them to remove their hands from the keyboard. このようなユーザーにとっては、効率性と一貫性が重要です。包括性が重要になるのは、特に頻繁に使用するコマンドに対してのみです。For these users, efficiency and consistency are crucial; comprehensiveness is important only for the most frequently used commands.

キーボード アクセラレータを指定するSpecify a keyboard accelerator

UWP アプリのキーボード アクセラレータを作成するには、KeyboardAccelerator API を使用します。Use the KeyboardAccelerator APIs to create keyboard accelerators in UWP apps. これらの API を使用すると、複数の KeyDown イベントを処理してキーの組み合わせの押下を検出する必要がなくなり、アプリのリソース内でアクセラレータをローカライズすることもできます。With these APIs, you don't have to handle multiple KeyDown events to detect the key combination pressed, and you can localize accelerators in the app resources.

アプリ内で特に一般的な操作に対してキーボード アクセラレータを設定し、メニュー項目のラベルまたはツール ヒントを使用してわかりやすく示すことをお勧めします。We recommend that you set keyboard accelerators for the most common actions in your app and document them using the menu item label or tooltip. この例では、名前の変更コマンドとコピー コマンドに対してのみキーボード アクセラレータを宣言しています。In this example, we declare keyboard accelerators only for the Rename and Copy commands.

<CommandBar Margin="0,200" AccessKey="M">
  <AppBarButton 
    Icon="Share" 
    Label="Share" 
    Click="OnShare" 
    AccessKey="S" />
  <AppBarButton 
    Icon="Copy" 
    Label="Copy" 
    ToolTipService.ToolTip="Copy (Ctrl+C)" 
    Click="OnCopy" 
    AccessKey="C">
    <AppBarButton.KeyboardAccelerators>
      <KeyboardAccelerator 
        Modifiers="Control" 
        Key="C" />
    </AppBarButton.KeyboardAccelerators>
  </AppBarButton>

  <AppBarButton 
    Icon="Delete" 
    Label="Delete" 
    Click="OnDelete" 
    AccessKey="D" />
  <AppBarSeparator/>
  <AppBarButton 
    Icon="Rename" 
    Label="Rename" 
    ToolTipService.ToolTip="Rename (F2)" 
    Click="OnRename" 
    AccessKey="R">
    <AppBarButton.KeyboardAccelerators>
      <KeyboardAccelerator 
        Modifiers="None" Key="F2" />
    </AppBarButton.KeyboardAccelerators>
  </AppBarButton>

  <AppBarButton 
    Icon="SelectAll" 
    Label="Select" 
    Click="OnSelect" 
    AccessKey="A" />
  
  <CommandBar.SecondaryCommands>
    <AppBarButton 
      Icon="OpenWith" 
      Label="Sources" 
      AccessKey="S">
      <AppBarButton.Flyout>
        <MenuFlyout>
          <ToggleMenuFlyoutItem Text="OneDrive" />
          <ToggleMenuFlyoutItem Text="Contacts" />
          <ToggleMenuFlyoutItem Text="Photos"/>
          <ToggleMenuFlyoutItem Text="Videos"/>
        </MenuFlyout>
      </AppBarButton.Flyout>
    </AppBarButton>
    <AppBarToggleButton 
      Icon="Save" 
      Label="Auto Save" 
      IsChecked="True" 
      AccessKey="A"/>
  </CommandBar.SecondaryCommands>

</CommandBar>

ツールヒントに説明されているキーボード アクセラレータKeyboard accelerator described in a tooltip
ツールヒントに説明されているキーボード アクセラレータKeyboard accelerator described in a tooltip

UIElement オブジェクトには、KeyboardAccelerator コレクションおよび KeyboardAccelerators があり、カスタムの KeyboardAccelerator オブジェクトを指定して、キーボード アクセラレータのキー入力を定義できます。The UIElement object has a KeyboardAccelerator collection, KeyboardAccelerators, where you specify your custom KeyboardAccelerator objects and define the keystrokes for the keyboard accelerator:

注意

単一キーのアクセラレータ (A、Del、F2、Space キー、Esc キー、マルチメディア キー) と複数キーのアクセラレータ (Ctrl + Shift + M) がサポートされます。Single key (A, Delete, F2, Spacebar, Esc, Multimedia Key) accelerators and multi-key accelerators (Ctrl+Shift+M) are supported. ただし、ゲームパッドの仮想キーはサポートされていません。However, Gamepad virtual keys are not supported.

アクセラレータのスコープScoped accelerators

アクセラレータには、アプリ全体で動作するものと、特定のスコープのみで動作するものがあります。Some accelerators work only in specific scopes while others work app-wide.

たとえば、Microsoft Outlook には、次のアクセラレータが含まれています。For example, Microsoft Outlook includes the following accelerators:

  • Ctrl + B、Ctrl + I、Esc キーは、メール送信フォームのスコープのみで動作します。Ctrl+B, Ctrl+I and ESC work only on the scope of the send email form
  • Ctrl + 1 と Ctrl + 2 は、アプリ全体で動作します。Ctrl+1 and Ctrl+2 work app-wide

コンテキスト メニューContext menus

コンテキスト メニューのアクションは、テキスト エディター内で選択された文字やプレイリスト内の曲など、特定の領域または要素のみに影響します。Context menu actions affect only specific areas or elements, such as the selected characters in a text editor or a song in a playlist. このため、コンテキスト メニュー項目のキーボード アクセラレータのスコープは、コンテキスト メニューの親に設定することをお勧めします。For this reason, we recommend setting the scope of keyboard accelerators for context menu items to the parent of the context menu.

キーボード アクセラレータのスコープを指定するには、ScopeOwnerプロパティを使用します。Use the ScopeOwner property to specify the scope of the keyboard accelerator. このコードでは、スコープ指定されたキーボード アクセラレータと共に、コンテキスト メニューを ListView に実装する方法を示します。This code demonstrates how to implement a context menu on a ListView with scoped keyboard accelerators:

<ListView x:Name="MyList">
  <ListView.ContextFlyout>
    <MenuFlyout>
      <MenuFlyoutItem Text="Share" Icon="Share"/>
      <MenuFlyoutItem Text="Copy" Icon="Copy">
        <MenuFlyoutItem.KeyboardAccelerators>
          <KeyboardAccelerator 
            Modifiers="Control" 
            Key="C" 
            ScopeOwner="{x:Bind MyList }" />
        </MenuFlyoutItem.KeyboardAccelerators>
      </MenuFlyoutItem>
      
      <MenuFlyoutItem Text="Delete" Icon="Delete" />
      <MenuFlyoutSeparator />
      
      <MenuFlyoutItem Text="Rename">
        <MenuFlyoutItem.KeyboardAccelerators>
          <KeyboardAccelerator 
            Modifiers="None" 
            Key="F2" 
            ScopeOwner="{x:Bind MyList}" />
        </MenuFlyoutItem.KeyboardAccelerators>
      </MenuFlyoutItem>
      
      <MenuFlyoutItem Text="Select" />
    </MenuFlyout>
    
  </ListView.ContextFlyout>
    
  <ListViewItem>Track 1</ListViewItem>
  <ListViewItem>Alternative Track 1</ListViewItem>

</ListView>

MenuFlyoutItem.KeyboardAccelerators 要素の ScopeOwner 属性は、アクセラレータがグローバルではなくスコープ指定されていることを示します (既定値はグローバルを示す null)。The ScopeOwner attribute of the MenuFlyoutItem.KeyboardAccelerators element marks the accelerator as scoped instead of global (the default is null, or global). 詳しくは、このトピックの「アクセラレータの解決」をご覧ください。For more detail, see the Resolving accelerators section later in this topic.

キーボード アクセラレータを呼び出すInvoke a keyboard accelerator

KeyboardAccelerator オブジェクトは、UI オートメーション (UIA) コントロール パターンを使用して、アクセラレータが呼び出されたときにアクションを実行します。The KeyboardAccelerator object uses the UI Automation (UIA) control pattern to take action when an accelerator is invoked.

UIA [コントロール パターン] では、一般的なコントロール機能が公開されます。The UIA [control patterns] expose common control functionality. たとえば、ボタン コントロールを実装する、 Invokeクリック イベントをサポートするコントロール パターン (通常はコントロールによって呼び出される順にクリック、ダブルクリック、または差し迫った」と入力、定義済みのキーボード ショートカット、またはその他のキーボード操作の組み合わせ)。For example, the Button control implements the Invoke control pattern to support the Click event (typically a control is invoked by clicking, double-clicking, or pressing Enter, a predefined keyboard shortcut, or some other combination of keystrokes). キーボード アクセラレータでコントロールが呼び出されると、XAML フレームワークは、コントロールに Invoke コントロール パターンが実装されているかどうかを調べ、その場合は、コントロールをアクティブ化します (KeyboardAcceleratorInvoked イベントをリッスンする必要はありません)。When a keyboard accelerator is used to invoke a control, the XAML framework looks up whether the control implements the Invoke control pattern and, if so, activates it (it is not necessary to listen for the KeyboardAcceleratorInvoked event).

次の例では、ボタンに Invoke パターンが実装されているため、Ctrl + S によって Click イベントがトリガーされます。In the following example, Control+S triggers the Click event because the button implements the Invoke pattern.

<Button Content="Save" Click="OnSave">
  <Button.KeyboardAccelerators>
    <KeyboardAccelerator Key="S" Modifiers="Control" />
  </Button.KeyboardAccelerators>
</Button>

要素に複数のコントロール パターンが実装されている場合、アクセラレータでアクティブ化できるのは 1 つだけです。If an element implements multiple control patterns, only one can be activated through an accelerator. コントロール パターンの優先順位は次のとおりです。The control patterns are prioritized as follows:

  1. Invoke (Button)Invoke (Button)
  2. Toggle (Checkbox)Toggle (Checkbox)
  3. Selection (ListView)Selection (ListView)
  4. Expand/Collapse (ComboBox)Expand/Collapse (ComboBox) 

一致するコントロール パターンが見つからない場合は、アクセラレータが無効となり、デバッグ メッセージが発行されます ("このコンポーネントのオートメーション パターンが見つかりません。If no match is identified, the accelerator is invalid and a debug message is provided ("No automation patterns for this component found. Invoked イベントに目的の動作をすべて実装してください。Implement all desired behavior in the Invoked event. イベント ハンドラーで Handled を true に設定すると、このメッセージは表示されません")。Setting Handled to true in your event handler suppresses this message.")

カスタムのキーボード アクセラレータの動作Custom keyboard accelerator behavior

KeyboardAccelerator オブジェクトの Invoked イベントは、アクセラレータが実行されたときに発生します。The Invoked event of the KeyboardAccelerator object is fired when the accelerator is executed. KeyboardAcceleratorInvokedEventArgs イベント オブジェクトには、次のプロパティが含まれています。The KeyboardAcceleratorInvokedEventArgs event object includes the following properties:

  • 処理 (ブール値)。これを true に設定して、コントロール パターンをトリガーするイベントを防止、アクセラレータ イベントのバブリングを停止します。Handled (Boolean): Setting this to true prevents the event triggering the control pattern and stops accelerator event bubbling. 既定値は false です。The default is false.
  • 要素 (DependencyObject)。アクセラレータに関連付けられているオブジェクト。Element (DependencyObject): The object associated with the accelerator.
  • KeyboardAccelerator:キーボード アクセス キー Invoked イベントを発生させるために使用します。KeyboardAccelerator: The keyboard accelerator used to raise the Invoked event.

ここで、ListView では、キーボード アクセラレータの項目のコレクションを定義する方法と各アクセラレータに Invoked イベントを処理する方法について説明します。Here we demonstrate how to define a collection of keyboard accelerators for items in a ListView, and how to handle the Invoked event for each accelerator.

<ListView x:Name="MyListView">
  <ListView.KeyboardAccelerators>
    <KeyboardAccelerator Key="A" Modifiers="Control,Shift" Invoked="SelectAllInvoked" />
    <KeyboardAccelerator Key="F5" Invoked="RefreshInvoked"  />
  </ListView.KeyboardAccelerators>
</ListView>
void SelectAllInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
  MyListView.SelectAll();
  args.Handled = true;
}

void RefreshInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
  MyListView.SelectionMode = ListViewSelectionMode.None;
  MyListView.SelectionMode = ListViewSelectionMode.Multiple;
  args.Handled = true;
}

既定のキーボード動作をオーバーライドします。Override default keyboard behavior

場合によっては、Backspace キーまたは Enter キーなどの特定のキーの既定の動作をオーバーライドする必要もあります。In some cases, you might need to override the default behavior of specific keys such as the Backspace key or the Enter key. 以下に例を示します。For example,

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

コントロールが無効になると、関連付けられたアクセラレータも無効になります。If a control is disabled, the associated accelerator is also disabled. 次の例では、ListView の IsEnabled プロパティが false に設定されているため、関連付けられている Control+A アクセラレータを呼び出すことができません。In the following example, because the IsEnabled property of the ListView is set to false, the associated Control+A accelerator can't be invoked.

<ListView >
  <ListView.KeyboardAccelerators>
    <KeyboardAccelerator Key="A"
      Modifiers="Control"
      Invoked="CustomListViewSelecAllInvoked" />
  </ListView.KeyboardAccelerators>
  
  <TextBox>
    <TextBox.KeyboardAccelerators>
      <KeyboardAccelerator 
        Key="A" 
        Modifiers="Control" 
        Invoked="CustomTextSelecAllInvoked" 
        IsEnabled="False" />
    </TextBox.KeyboardAccelerators>
  </TextBox>

<ListView>

親と子のコントロールは、同じアクセラレータを共有できます。Parent and child controls can share the same accelerator. この場合は、子にフォーカスがあってアクセス キーが無効になっている場合でも、親のコントロールを呼び出すことができます。In this case, the parent control can be invoked even if the child has focus and its accelerator is disabled.

スクリーン リーダーとキーボード アクセラレータScreen readers and keyboard accelerators

ナレーターなどのスクリーン リーダーでは、キーボード アクセラレータを構成するキーの組み合わせをユーザーに読み上げることができます。Screen readers such as Narrator can announce the keyboard accelerator key combination to users. 既定では、各修飾キー (VirtualModifiers 列挙の順) の後にキーが ("+" 記号で区切って) 組み合わされています。By default, this is each modifier (in the VirtualModifiers enum order) followed by the key (and separated by "+" signs). これは、AutomationProperties の AcceleratorKey 添付プロパティを通じてカスタマイズできます。You can customize this through the AcceleratorKey AutomationProperties attached property. 複数のアクセラレータが指定されている場合は、最初のものだけが通知されます。If more than one accelerator is specified, only the first is announced.

この例では、AutomationProperty.AcceleratorKey は "Control+Shift+A" という文字列を返します。In this example, the AutomationProperty.AcceleratorKey returns the string "Control+Shift+A":

<ListView x:Name="MyListView">
  <ListView.KeyboardAccelerators>

    <KeyboardAccelerator 
      Key="A" 
      Modifiers="Control,Shift" 
      Invoked="CustomSelectAllInvoked" />
      
    <KeyboardAccelerator 
      Key="F5" 
      Modifiers="None" 
      Invoked="RefreshInvoked" />

  </ListView.KeyboardAccelerators>

</ListView>   

注意

AutomationProperties.AcceleratorKey を設定しても、キーボード機能が有効になるのではなく、使用するキーが UIA フレームワークに通知されるだけです。Setting AutomationProperties.AcceleratorKey doesn't enable keyboard functionality, it only indicates to the UIA framework which keys are used.

一般的なキーボード アクセラレータCommon Keyboard Accelerators

キーボード アクセラレータは、どの UWP アプリケーションでも統一することをお勧めします。We recommend that you make keyboard accelerators consistent across UWP applications. ユーザーは、キーボード アクセラレータを記憶する必要があり、同じ (または同様の) 結果を期待します。Users have to memorize keyboard accelerators and expect the same (or similar) results.

このことは、アプリによる機能の相違のため実現できないこともあります。This might not always be possible due to differences in functionality across apps.

編集Editing 一般的なキーボード アクセラレータCommon Keyboard Accelerator
編集モードを開始するBegin editing mode Ctrl + ECtrl + E
フォーカスのあるコントロール内またはウィンドウ内のすべての項目を選択するSelect all items in a focused control or window Ctrl + ACtrl + A
検索して置換Search and replace Ctrl + HCtrl + H
元に戻すUndo Ctrl + ZCtrl + Z
RedoRedo Ctrl + YCtrl + Y
選択範囲を削除してクリップボードにコピーするDelete selection and copy it to the clipboard Ctrl + XCtrl + X
選択範囲をクリップボードにコピーするCopy selection to the clipboard Ctrl + C、Ctrl + InsCtrl + C, Ctrl + Insert
クリップボードの内容を貼り付けるPaste the contents of the clipboard Ctrl + V、Shift + InsCtrl + V, Shift + Insert
クリップボードの内容を貼り付ける (オプションあり)Paste the contents of the clipboard (with options) Ctrl + Alt + VCtrl + Alt + V
項目の名前を変更するRename an item F2F2
新しい項目を追加するAdd a new item Ctrl + NCtrl + N
新しいセカンダリ項目を追加するAdd a new secondary item Ctrl + Shift + NCtrl + Shift + N
選択した項目を削除する (元に戻すオプションあり)Delete selected item (with undo) Del、Ctrl+DDel, Ctrl+D
選択した項目を削除する (元に戻すオプションなし)Delete selected item (without undo) Shift + DelShift + Del
BoldBold Ctrl + BCtrl + B
UnderlineUnderline Ctrl + UCtrl + U
ItalicItalic Ctrl + ICtrl + I
ナビゲーションNavigation
フォーカスのあるコントロールまたはウィンドウでコンテンツを見つけるFind content in a focused control or Window Ctrl + FCtrl + F
次の検索結果に移動するGo to the next search result F3F3
その他のアクションOther Actions
お気に入りに追加するAdd favorites Ctrl + DCtrl + D  
RefreshRefresh F5 または Ctrl + RF5 or Ctrl + R  
拡大Zoom In Ctrl + +Ctrl + +  
縮小Zoom out Ctrl + -Ctrl + -  
既定の表示倍率に拡大縮小Zoom to default view Ctrl + 0Ctrl + 0  
SaveSave Ctrl + SCtrl + S  
CloseClose Ctrl + WCtrl + W  
印刷Print Ctrl + PCtrl + P  

ローカライズされたバージョンの Windows では使用できない組み合わせもあります。Notice that some of the combinations are not valid for localized versions of Windows. たとえば、スペイン語バージョンの Windows では、太字の指定には Ctrl + B ではなく Ctrl + N が使用されます。For example, in the Spanish version of Windows, Ctrl+N is used for bold instead of Ctrl+B. アプリがローカライズされている場合は、ローカライズされたキーボード アクセラレータを用意することをお勧めします。We recommend providing localized keyboard accelerators if the app is localized.

キーボード アクセラレータのユーザビリティ アフォーダンスUsability affordances for keyboard accelerators

ヒントTooltips

通常、キーボード アクセラレータは UWP アプリケーションの UI で直接説明されるものではありません。ユーザーがフォーカスをコントロールに移動したり、コントロールを長押ししたり、マウス ポインターをコントロール上にホバーしたりするときに自動的に表示される、ヒントを使用すると、キーボード アクセラレータが見つけやすくなります。As keyboard accelerators are not typically described directly in the UI of your UWP application, you can improve discoverability through tooltips, which display automatically when the user moves focus to, presses and holds, or hovers the mouse pointer over a control. ヒントによって、コントロールにキーボード アクセラレータが関連付けられているかどうかを識別でき、関連付けられている場合は、アクセラレータ キーの組み合わせを識別することができます。The tooltip can identify whether a control has an associated keyboard accelerator and, if so, what the accelerator key combination is.

Windows 10、バージョン 1803 (2018 年 4 月の更新プログラム) 以降Windows 10, Version 1803 (April 2018 Update) and newer

既定でキーボード アクセラレータの宣言時に、すべてのコントロール (を除くMenuFlyoutItemToggleMenuFlyoutItem)、ツールヒントに、対応するキーの組み合わせを表示します。By default, When keyboard accelerators are declared, all controls (except MenuFlyoutItem and ToggleMenuFlyoutItem) present the corresponding key combinations in a tooltip.

注意

コントロールには、複数のアクセラレータが定義されている場合、最初のメッセージだけが表示されます。If a control has more than one accelerator defined, only the first is presented.

アクセラレータ キーのヒント

ツールヒントにアクセラレータ キーの組み合わせAccelerator key combo in tooltip

ボタンAppBarButton、およびAppBarToggleButtonオブジェクト、コントロールの既定のヒントに、キーボード アクセス キーが追加されます。For Button, AppBarButton, and AppBarToggleButton objects, the keyboard accelerator is appended to the control's default tooltip. MenuFlyoutItemToggleMenuFlyoutItem) オブジェクトの場合、ポップアップ テキストで、キーボード アクセス キーが表示されます。For MenuFlyoutItem and ToggleMenuFlyoutItem) objects, the keyboard accelerator is displayed with the flyout text.

注意

ツールヒントを指定する (次の例では Button1 を参照) は、この動作をオーバーライドします。Specifying a tooltip (see Button1 in the following example) overrides this behavior.

<StackPanel x:Name="Container" Grid.Row="0" Background="AliceBlue">
    <Button Content="Button1" Margin="20"
            Click="OnSave" 
            KeyboardAcceleratorPlacementMode="Auto" 
            ToolTipService.ToolTip="Tooltip">
        <Button.KeyboardAccelerators>
            <KeyboardAccelerator  Key="A" Modifiers="Windows"/>
        </Button.KeyboardAccelerators>
    </Button>
    <Button Content="Button2"  Margin="20"
            Click="OnSave" 
            KeyboardAcceleratorPlacementMode="Auto">
        <Button.KeyboardAccelerators>
            <KeyboardAccelerator  Key="B" Modifiers="Windows"/>
        </Button.KeyboardAccelerators>
    </Button>
    <Button Content="Button3"  Margin="20"
            Click="OnSave" 
            KeyboardAcceleratorPlacementMode="Auto">
        <Button.KeyboardAccelerators>
            <KeyboardAccelerator  Key="C" Modifiers="Windows"/>
        </Button.KeyboardAccelerators>
    </Button>
</StackPanel>

アクセラレータ キーのヒント

ボタンの既定のヒントに追加されたアクセラレータ キーの組み合わせAccelerator key combo appended to Button's default tooltip

<AppBarButton Icon="Save" Label="Save">
    <AppBarButton.KeyboardAccelerators>
        <KeyboardAccelerator Key="S" Modifiers="Control"/>
    </AppBarButton.KeyboardAccelerators>
</AppBarButton>

アクセラレータ キーのヒント

AppBarButton の既定のヒントに追加されたアクセラレータ キーの組み合わせAccelerator key combo appended to AppBarButton's default tooltip

<AppBarButton AccessKey="R" Icon="Refresh" Label="Refresh" IsAccessKeyScope="True">
    <AppBarButton.Flyout>
        <MenuFlyout>
            <MenuFlyoutItem AccessKey="A" Icon="Refresh" Text="Refresh A">
                <MenuFlyoutItem.KeyboardAccelerators>
                    <KeyboardAccelerator Key="R" Modifiers="Control"/>
                </MenuFlyoutItem.KeyboardAccelerators>
            </MenuFlyoutItem>
            <MenuFlyoutItem AccessKey="B" Icon="Globe" Text="Refresh B" />
            <MenuFlyoutItem AccessKey="C" Icon="Globe" Text="Refresh C" />
            <MenuFlyoutItem AccessKey="D" Icon="Globe" Text="Refresh D" />
            <ToggleMenuFlyoutItem AccessKey="E" Icon="Globe" Text="ToggleMe">
                <MenuFlyoutItem.KeyboardAccelerators>
                    <KeyboardAccelerator Key="Q" Modifiers="Control"/>
                </MenuFlyoutItem.KeyboardAccelerators>
            </ToggleMenuFlyoutItem>
        </MenuFlyout>
    </AppBarButton.Flyout>
</AppBarButton>

アクセラレータ キーのヒント

MenuFlyoutItem のテキストに追加されたアクセラレータ キーの組み合わせAccelerator key combo appended to MenuFlyoutItem's text

使用して、プレゼンテーションの動作を制御、 KeyboardAcceleratorPlacementModeプロパティで、2 つの値を受け入れます。自動または隠しします。Control the presentation behavior by using the KeyboardAcceleratorPlacementMode property, which accepts two values: Auto or Hidden.

<Button Content="Save" Click="OnSave" KeyboardAcceleratorPlacementMode="Auto">
    <Button.KeyboardAccelerators>
        <KeyboardAccelerator Key="S" Modifiers="Control" />
    </Button.KeyboardAccelerators>
</Button>

場合によっては、他の要素 (通常はコンテナー オブジェクト) に関連するヒントを表示する必要があります。In some cases, you might need to present a tooltip relative to another element (typically a container object). たとえば、ピボット ヘッダー共に PivotItem のヒントを表示するピボット コントロールがあります。For example, a Pivot control that displays the tooltip for a PivotItem with the Pivot header.

ここでは、KeyboardAcceleratorPlacementTarget プロパティを使用して、[保存] ボタンのキーボード アクセラレータを構成するキーの組み合わを表示する方法について説明します。この例では、ボタンではなく Grid コンテナーを使用します。Here, we show how to use the KeyboardAcceleratorPlacementTarget property to display the keyboard accelerator key combination for a Save button with the Grid container instead of the button.

<Grid x:Name="Container" Padding="30">
  <Button Content="Save"
    Click="OnSave"
    KeyboardAcceleratorPlacementMode="Auto"
    KeyboardAcceleratorPlacementTarget="{x:Bind Container}">
    <Button.KeyboardAccelerators>
      <KeyboardAccelerator  Key="S" Modifiers="Control" />
    </Button.KeyboardAccelerators>
  </Button>
</Grid>

ラベルLabels

場合によっては、コントロールのラベルを使用して、コントロールにキーボード アクセラレータが関連付けられているかどうかを識別し、関連付けられている場合は、アクセラレータ キーの組み合わせを識別することをお勧めします。In some cases, we recommend using a control's label to identify whether the control has an associated keyboard accelerator and, if so, what the accelerator key combination is.

一部のプラットフォームのコントロールでは、既定でこの識別が行われます。具体的には、MenuFlyoutItem オブジェクトと ToggleMenuFlyoutItem オブジェクトで実行されます。これに対して、AppBarButtonAppBarToggleButton は、CommandBar のオーバーフロー メニューにこれらが表示されたときに、この識別が行われます。Some platform controls do this by default, specifically the MenuFlyoutItem and ToggleMenuFlyoutItem objects, while the AppBarButton and the AppBarToggleButton do it when they appear in the overflow menu of the CommandBar.

メニュー項目のラベルで説明されているキーボード アクセラレータKeyboard accelerators described in a menu item label
メニュー項目のラベルで説明されているキーボード アクセラレータKeyboard accelerators described in a menu item label

MenuFlyoutItemToggleMenuFlyoutItemAppBarButtonAppBarToggleButton の各コントロールの KeyboardAcceleratorTextOverride プロパティを使用して、ラベルの既定のアクセラレータ テキストを上書きすることができます。You can override the default accelerator text for the label through the KeyboardAcceleratorTextOverride property of the MenuFlyoutItem, ToggleMenuFlyoutItem, AppBarButton, and AppBarToggleButton controls (use a single space for no text).

注意

上書きしたテキストは、取り付けられているキーボードをシステムが検出できない場合は表示されません (取り付けられているキーボードの検出は、KeyboardPresent プロパティを使用して、ご自分で確認することができます)。The override text is not be presented if the system cannot detect an attached keyboard (you can check this yourself through the KeyboardPresent property).

高度な概念Advanced Concepts

ここでは、キーボード アクセラレータの基本的な特徴をいくつか確認します。Here, we review some low-level aspects of keyboard accelerators.

アクセラレータの呼び出しWhen an accelerator is invoked

アクセラレータは、2 種類のキー (修飾キーと非修飾キー) で構成されます。Accelerators are composed of two types of keys: modifiers and non-modifiers. 修飾キーには、Shift キー、メニュー キー、Ctrl キー、Windows キーがあり、VirtualKeyModifiers で公開されます。Modifier keys include Shift, Menu, Control, and the Windows key, which are exposed through VirtualKeyModifiers. 非修飾子キーは、Del キー、F3 キー、Space キー、Esc キーなどのすべての仮想キーと、すべての英数字キー、記号キーです。Non-modifiers are any virtual key, such as Delete, F3, Spacebar, Esc, and all alphanumeric and punctuation keys. キーボード アクセラレータは、ユーザーが 1 つまたは複数の修飾キーを押しながら非修飾キーを押したときに呼び出されます。A keyboard accelerator is invoked when the user presses a non-modifier key while they press and hold one or more modifier keys. たとえば、ユーザーが Ctrl + Shift + M を押す場合、M キーが押されたときに、フレームワークは修飾キー (Ctrl キーと Shift キー) を確認し、存在する場合はアクセラレータを起動します。For example, if the user presses Ctrl+Shift+M, when the user presses M, the framework checks the modifiers (Ctrl and Shift) and fires the accelerator, if it exists.

注意

仕様では、アクセラレータは自動的に反復されます (たとえば、ユーザーが Ctrl + Shift を押しながら M キーを押した場合は、M キーが解放されるまで、アクセラレータが繰り返し呼び出されます)。By design, the accelerator autorepeats (for example, when the user presses Ctrl+Shift and then holds down M, the accelerator is invoked repeatedly until M is released). この動作は変更できません。This behavior cannot be modified.

入力イベントの優先順位Input event priority

入力イベントは特定の順序で発生します。これをインターセプトし、アプリの要件に基づいて処理することができます。Input events occur in a specific sequence that you can intercept and handle based on the requirements of your app.

KeyDown/KeyUp バブル イベントThe KeyDown/KeyUp bubbling event

XAML では、入力バブル パイプラインが 1 つだけであるかのようにキー入力が処理されます。In XAML, a keystroke is processed as if there is just one input bubbling pipeline. この入力パイプラインは KeyDown/KeyUp イベントや文字入力によって使用されます。This input pipeline is used by the KeyDown/KeyUp events and character input. たとえば、要素にフォーカスがある場合にユーザーがキーを押すと、その要素で KeyDown イベントが発生します。これに続き、要素の親、さらにその親と、args.Handled プロパティが true になるまでツリー上層方向にイベントの発生が続きます。For example, if an element has focus and the user presses a key down, a KeyDown event is raised on the element, followed by the parent of the element, and so on up the tree, until the args.Handled property is true.

KeyDown イベントは、一部のコントロールで組み込みのコントロール アクセラレータを実装するためにも使用されます。The KeyDown event is also used by some controls to implement the built-in control accelerators. コントロールにキーボード アクセラレータが設定されている場合は、KeyDown イベントが処理されます。つまり、KeyDown イベント バブルは発生しません。When a control has a keyboard accelerator, it handles the KeyDown event, which means that there won't be KeyDown event bubbling. たとえば、RichEditBox は、Ctrl + C によるコピー操作をサポートします。For example, the RichEditBox supports copy with Ctrl+C. Ctrl が押されると KeyDown イベントおよびバブルが発生しますが、ユーザーが同時に C キーを押した場合、KeyDown イベントが Handled となり発生しません (UIElement.AddHandler の handledEventsToo パラメーターが true に設定されている場合は例外)。When Ctrl is pressed, the KeyDown event is fired and bubbles, but when the user presses C at the same time, the KeyDown event is marked Handled and is not raised (unless the handledEventsToo parameter of UIElement.AddHandler is set to true).

CharacterReceived イベントThe CharacterReceived event

TextBox などのテキスト コントロールに対する KeyDown イベントの後で CharacterReceived イベントが発生した場合は、KeyDown イベント ハンドラーで文字入力を取り消すことができます。As the CharacterReceived event is fired after the KeyDown event for text controls such as TextBox, you can cancel character input in the KeyDown event handler.

PreviewKeyDown イベントと PreviewKeyUp イベントThe PreviewKeyDown and PreviewKeyUp events

プレビュー入力イベントは、他のイベントの前に発生します。The preview input events are fired before any other events. これらのイベントを処理しない場合は、フォーカスのある要素のアクセラレータが呼び出され、これに続いて KeyDown イベントが発生します。If you don't handle these events, the accelerator for the element that has the focus is fired, followed by the KeyDown event. 処理されるまで、両方のイベントのバブルが発生します。Both events bubble until handled.

イベントのシーケンスをキー イベント シーケンスをキーKey event sequence Key event sequence

イベントの順序:Order of events:

PreviewKeyDown イベント …Preview KeyDown events … アプリ アクセラレータ、OnKeyDown メソッド、KeyDown イベント、親に対するアプリ アクセラレータ、親に対する OnKeyDown メソッド、親に対する KeyDown イベント (ルートまでバブル) …App accelerator OnKeyDown method KeyDown event App accelerators on the parent OnKeyDown method on the parent KeyDown event on the parent (Bubbles to the root) … CharacterReceived イベント、PreviewKeyUp イベント、KeyUp イベントCharacterReceived event PreviewKeyUp events KeyUpEvents

アクセラレータ イベントが処理されると、KeyDown イベントも処理済みとしてマークされます。When the accelerator event is handled, the KeyDown event is also marked as handled. KeyUp イベントは、未処理のままとなります。The KeyUp event remains unhandled.

アクセラレータの解決Resolving accelerators

フォーカスのある要素からルートまで、キーボード アクセラレータ イベントのバブルが発生します。A keyboard accelerator event bubbles from the element that has focus up to the root. イベントが処理されない場合、XAML フレームワークはバブル パスの外で、スコープ外の他のアプリ アクセラレータを探します。If the event isn't handled, the XAML framework looks for other unscoped app accelerators outside of the bubbling path.

2 つのキーボード アクセラレータが同じキーの組み合わせで定義されている場合は、ビジュアル ツリーで最初に見つかったキーボード アクセラレータが呼び出されます。When two keyboard accelerators are defined with the same key combination, the first keyboard accelerator found on the visual tree is invoked.

スコープ指定されたキーボード アクセラレータは、フォーカスが特定のスコープ内にある場合にのみ呼び出されます。Scoped keyboard accelerators are invoked only when focus is inside a specific scope. たとえば、多数のコントロールが含まれる Grid では、Grid (スコープ所有者) 内にフォーカスがある場合にのみ、コントロールに対してキーボード アクセラレータを呼び出すことができます。For example, in a Grid that contains dozens of controls, a keyboard accelerator can be invoked for a control only when focus is within the Grid (the scope owner).

アクセラレータのスコープをプログラムで指定するScoping accelerators programmatically

UIElement.TryInvokeKeyboardAccelerator メソッドは、要素のサブツリー内で一致するアクセラレータを呼び出します。The UIElement.TryInvokeKeyboardAccelerator method invokes any matching accelerators in the subtree of the element.

UIElement.OnProcessKeyboardAccelerators メソッドは、キーボード アクセラレータの前に実行されます。The UIElement.OnProcessKeyboardAccelerators method is executed before the keyboard accelerator. このメソッドは、キー、修飾子、およびブール値 (キーボード アクセラレータが処理済みかどうかを示す) が含まれた ProcessKeyboardAcceleratorArgs オブジェクトを渡します。This method passes a ProcessKeyboardAcceleratorArgs object that contains the key, the modifier, and a Boolean indicating whether the keyboard accelerator is handled. 処理済みとしてマークされると、キーボード アクセラレータでバブルが発生します (外部のキーボード アクセラレータが呼び出されることはありません)。If marked as handled, the keyboard accelerator bubbles (so the outside keyboard accelerator is never invoked).

注意

処理済みかどうかに関係なく、OnProcessKeyboardAccelerators は常に発生します (OnKeyDown イベントに似ています)。OnProcessKeyboardAccelerators always fires, whether handled or not (similar to the OnKeyDown event). イベントが処理済みとしてマークされたかどうかを確認する必要があります。You must check whether the event was marked as handled.

この例では、OnProcessKeyboardAccelerators と TryInvokeKeyboardAccelerator を使用して、キーボード アクセラレータのスコープを Page オブジェクトに設定します。In this example, we use OnProcessKeyboardAccelerators and TryInvokeKeyboardAccelerator to scope keyboard accelerators to the Page object:

protected override void OnProcessKeyboardAccelerators(
  ProcessKeyboardAcceleratorArgs args)
{
  if(args.Handled != true)
  {
    this.TryInvokeKeyboardAccelerator(args);
    args.Handled = true;
  }
}

アクセラレータのローカライズLocalize the accelerators

キーボード アクセラレータは、すべてローカライズすることをお勧めします。We recommend localizing all keyboard accelerators. これを行うには、標準的な UWP リソース (.resw) ファイルと XAML 宣言の x:Uid 属性を使用します。You can do this with the standard UWP resources (.resw) file and the x:Uid attribute in your XAML declarations. この例では、Windows ランタイムによってリソースが自動的に読み込まれます。In this example, the Windows Runtime automatically loads the resources.

UWP のリソース ファイルを使用してアクセラレータのローカライズをキーボード UWP リソース ファイルを使用してキーボードのアクセラレータのローカライズKeyboard accelerator localization with UWP resources file Keyboard accelerator localization with UWP resources file

<Button x:Uid="myButton" Click="OnSave">
  <Button.KeyboardAccelerators>
    <KeyboardAccelerator x:Uid="myKeyAccelerator" Modifiers="Control"/>
  </Button.KeyboardAccelerators>
</Button>

アクセラレータをプログラムでセットアップするSetup an accelerator programmatically

アクセラレータをプログラムで定義する例を次に示します。Here is an example of programmatically defining an accelerator:

void AddAccelerator(
  VirtualKeyModifiers keyModifiers, 
  VirtualKey key, 
  TypedEventHandler<KeyboardAccelerator, KeyboardAcceleratorInvokedEventArgs> handler )
  {
    var accelerator = 
      new KeyboardAccelerator() 
      { 
        Modifiers = keyModifiers, Key = key
      };
    accelerator.Invoked = handler;
    this.KeyAccelerators.Add(accelerator);
  }

注意

KeyboardAccelerator は共有できません。同じ KeyboardAccelerator を複数の要素に追加することはできません。KeyboardAccelerator is not shareable, the same KeyboardAccelerator can't be added to multiple elements.

キーボード アクセラレータの動作を上書きするOverride keyboard accelerator behavior

KeyboardAccelerator.Invoked イベントを処理して、KeyboardAccelerator の既定の動作を上書きできます。You can handle the KeyboardAccelerator.Invoked event to override the default KeyboardAccelerator behavior.

次の例は、カスタムの ListView コントロールで "すべて選択" コマンド (キーボード アクセラレータは Ctrl + A) を上書きする方法を示しています。This example shows how to override the "Select all" command (Ctrl+A keyboard accelerator) in a custom ListView control. また、Handled プロパティを true に設定して、以降のイベント バブルを停止します。We also set the Handled property to true to stop the event bubbling further.

public class MyListView : ListView
{
  …
  protected override void OnKeyboardAcceleratorInvoked(KeyboardAcceleratorInvokedEventArgs args) 
  {
    if(args.Accelerator.Key == VirtualKey.A 
      && args.Accelerator.Modifiers == KeyboardModifiers.Control)
    {
      CustomSelectAll(TypeOfSelection.OnlyNumbers); 
      args.Handled = true;
    }
  }
  …
}

サンプルSamples