Klávesové akcelerátory

Hlavní obrázek klávesnice Surface

Urychlovače klávesnice (nebo klávesové zkratky) jsou klávesové zkratky, které zlepšují použitelnost a přístupnost aplikací pro Windows tím, že uživatelům poskytují intuitivní způsob, jak vyvolat běžné akce nebo příkazy bez navigace v uživatelském rozhraní aplikace.

Poznámka:

Klávesnice je nezbytná pro uživatele s určitým postižením (viz přístupnost pomocí klávesnice) a je také důležitým nástrojem pro uživatele, kteří ho dávají přednost jako efektivnější způsob interakce s aplikací.

Podrobnosti o navigaci v uživatelském rozhraní aplikace pro Windows pomocí klávesových zkratek najdete v tématu Access.

Pokud chcete vytvořit vlastní klávesové zkratky, přečtěte si téma Události klávesnice .

Přehled

Akcelerátory se skládají ze dvou typů klíčů: modifikátorů a nemodifikátorů. Modifikační klávesy zahrnují klávesy Shift, Menu, Control a Windows, které jsou zpřístupněny prostřednictvím VirtualKeyModifiers. Mezi nemodifikátory patří libovolný virtuální klíč, například Delete, F3, mezerník, šipka, Esc a všechny alfanumerické a interpunkční klávesy.

Poznámka:

Akcelerátory obvykle zahrnují funkční klávesy F1 až F12 nebo některé kombinace standardní klávesy spárované s jednou nebo více modifikačními klávesami (CTRL, Shift). Pokud například uživatel stiskne kombinaci kláves Ctrl+Shift+M, architektura zkontroluje modifikátory (Ctrl a Shift) a aktivuje akcelerátor, pokud existuje.

Mnoho ovládacích prvků XAML má integrované akcelerátory klávesnice. ListView například podporuje Ctrl+A pro výběr všech položek v seznamu a RichEditBox podporuje Ctrl+Tab pro vložení tabulátoru do textového pole. Tyto předdefinované akcelerátory klávesnice se označují jako řídicí akcelerátory a spouští se pouze v případě, že je fokus na prvku nebo na jednom z podřízených prvků. Akcelerátory definované pomocí rozhraní API akcelerátoru klávesnice, které jsou zde popsány, se označují jako akcelerátory aplikací.

Akcelerátory klávesnice nejsou k dispozici pro každou akci, ale často se přidružují k příkazům vystaveným v nabídkách (a měly by být zadány s obsahem položky nabídky). Akcelerátory lze také přidružit k akcím, které nemají ekvivalentní položky nabídky. Vzhledem k tomu, že uživatelé spoléhají na nabídky aplikace, abyste zjistili dostupnou sadu příkazů a naučili se ji, měli byste zkusit zjistit akcelerátory co nejsnadněji (použití popisků nebo zavedených vzorů vám s tím může pomoct).

Akcelerátor se automaticky opakuje (například když uživatel stiskne kombinaci kláves Ctrl+Shift a pak podrží klávesu M, bude akcelerátor vyvoláván opakovaně, dokud není klávesa M uvolněna). Toto chování nelze změnit.

Snímek obrazovky s akcelerátory klávesnice v popisku položky nabídky
Klávesové zkratky uvedené v názvu položky nabídky

Kdy používat akcelerátory klávesnice

Doporučujeme zadat akcelerátory klávesnice všude, kde je to vhodné v uživatelském rozhraní, a podporovat akcelerátory ve všech vlastních ovládacích prvcích.

  • Akcelerátory klávesnice usnadňují přístup k aplikaci uživatelům s motorovým postižením, včetně uživatelů, kteří můžou stisknout jenom jednu klávesu najednou nebo mají potíže s používáním myši.

    Dobře navržené uživatelské rozhraní klávesnice je důležitým aspektem přístupnosti softwaru. Umožňuje uživatelům s vadami zraku nebo s určitým motorickým postižením procházet aplikaci a pracovat s jejími funkcemi. Tito uživatelé možná nebudou moct pracovat s myší a místo toho spoléhají na různé technologie usnadnění, jako jsou nástroje pro vylepšení klávesnice, klávesnice na obrazovce, zvětšovače obrazovky, čtečky obrazovky a nástroje pro hlasový vstup. Pro tyto uživatele je zásadní komplexní pokrytí příkazů.

  • Klávesové zkratky usnadňují používání aplikace pro pokročilé uživatele, kteří dávají přednost interakci pomocí klávesnice.

    Zkušení uživatelé často mají silnou předvolbu pro používání klávesnice, protože příkazy založené na klávesnici je možné zadat rychleji a nevyžadují, aby si odebrali ruce z klávesnice. Pro tyto uživatele je zásadní efektivita a konzistence; komplexnost je důležitá jenom pro nejčastěji používané příkazy.

Zadání akcelerátoru klávesnice

Pomocí rozhraní API KeyboardAccelerator můžete vytvářet akcelerátory klávesnice v aplikacích pro Windows. U těchto rozhraní API nemusíte zpracovávat více událostí KeyDownu, abyste zjistili stisknutou kombinaci kláves a v prostředcích aplikace můžete lokalizovat akcelerátory.

Doporučujeme nastavit akcelerátory klávesnice pro nejběžnější akce v aplikaci a dokumentovat je pomocí popisku nabídky nebo popisku nástroje. V tomto příkladu deklarujeme akcelerátory klávesnice pouze pro příkazy Přejmenovat a Kopírovat.

<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>

Snímek obrazovky s akcelerátorem klávesnice v popisu
Akcelerátor klávesnice popsaný v popisu

Objekt UIElement má kolekci KeyboardAccelerator, KeyboardAccelerators, kde zadáte vlastní objekty KeyboardAccelerator a definujete stisknutí kláves pro akcelerátor klávesnice:

Poznámka:

Podporují se akcelerátory s jedním stisknutím kláves (A, Delete, F2, mezerník, Esc, multimediální klávesa) a akcelerátory s více klávesami (Ctrl+Shift+M). Virtuální klíče Gamepadu se ale nepodporují.

Akcelerátory s vymezeným oborem

Některé akcelerátory fungují jenom v konkrétních oborech, zatímco jiné fungují v celé aplikaci.

Například Microsoft Outlook zahrnuje následující akcelerátory:

  • Ctrl+B, Ctrl+I a ESC fungují jenom v rozsahu e-mailového formuláře pro odesílání
  • Ctrl+1 a Ctrl+2 funguje v celé aplikaci

Místní nabídky

Akce místní nabídky ovlivňují pouze určité oblasti nebo prvky, například vybrané znaky v textovém editoru nebo skladbu v seznamu stop. Z tohoto důvodu doporučujeme nastavit obor akcelerátorů klávesnice pro položky místní nabídky na nadřazenou položku místní nabídky.

K určení rozsahu akcelerátoru klávesnice použijte vlastnost ScopeOwner . Tento kód ukazuje, jak implementovat místní nabídku v ListView s vymezenými akcelerátory klávesnice:

<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>

Atribut ScopeOwner prvku MenuFlyoutItem.KeyboardAccelerators označuje akcelerátor jako vymezený místo globálního objektu (výchozí hodnota je null nebo globální). Další podrobnosti najdete v části Řešení akcelerátorů dále v tomto tématu.

Vyvolání akcelerátoru klávesnice

Objekt KeyboardAccelerator používá vzor ovládacího prvku model UI Automation (UIA) k vykonání akce, když je akcelerátor vyvolán.

UIA [vzory ovládacích prvků] zpřístupňují standardní funkčnost. Například ovládací prvek Button implementuje vzor ovládacího prvku Invoke pro podporu události Click (obvykle je vyvolán ovládací prvek kliknutím, poklikáním nebo stisknutím klávesy Enter, předdefinovanou klávesovou zkratkou nebo jinou kombinací klávesových úhozů). Pokud se k vyvolání ovládacího prvku používá akcelerátor klávesnice, architektura XAML vyhledá, jestli ovládací prvek implementuje vzor ovládacího prvku Invoke a pokud ano, aktivuje ho (není nutné naslouchat události KeyboardAcceleratorIn invoke).

V následujícím příkladu control+S aktivuje událost Kliknutí, protože tlačítko implementuje vzor Invoke.

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

Pokud prvek implementuje více řídicích vzorů, lze prostřednictvím akcelerátoru aktivovat pouze jeden. Vzory ovládacích prvků jsou upřednostňovány následujícím způsobem:

  1. Vyvolání (tlačítko)
  2. Přepnout (zaškrtávací políčko)
  3. Výběr (ListView)
  4. Rozbalení/sbalení (Kombinované pole)

Pokud není zjištěna žádná shoda, akcelerátor je neplatný a zobrazí se ladicí zpráva ("Pro tuto komponentu nebyly nalezeny žádné vzory automatizace. Implementujte veškeré požadované chování ve vyvolané události. Nastavení vlastnosti Handled na hodnotu true ve vašem obslužném kódu události potlačuje tuto zprávu.")

Vlastní chování akcelerátoru klávesnice

Vyvolána událost Objekt KeyboardAccelerator se aktivuje při spuštění akcelerátoru. Objekt události KeyboardAcceleratorInvokedEventArgs obsahuje následující vlastnosti:

  • Handled (Boolean): Nastavením této hodnoty na true zabráníte události, která aktivuje vzor ovládacího prvku, a zastaví bublinové události akcelerátoru. Výchozí hodnota je false.
  • Element (DependencyObject): Objekt přidružený k akcelerátoru.
  • KeyboardAccelerator: Akcelerátor klávesnice použitý k vyvolání události.

Zde si ukážeme, jak definovat kolekci akcelerátorů klávesnice pro položky v ListView a jak zpracovat vyvolanou událost pro každý akcelerátor.

<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;
}

Změna výchozího chování klávesnice

Některé ovládací prvky, když mají fokus, podporují integrované akcelerátory klávesnice, které přepíší jakýkoli akcelerátor definovaný aplikacím. Pokud má například textové pole fokus, akcelerátor Control+C zkopíruje aktuálně vybraný text (akcelerátory definované aplikací se ignorují a nespustí se žádné další funkce).

I když nedoporučujeme přepisovat výchozí chování ovládacích prvků kvůli znalostem a očekáváním uživatelů, můžete přepsat integrovaný akcelerátor klávesnice ovládacího prvku. Následující příklad ukazuje, jak přepsat akcelerátor klávesnice Control+C pro TextBox prostřednictvím obslužné rutiny události PreviewKeyDown :

 private void TextBlock_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
 {
    var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(Windows.System.VirtualKey.Control);
    var isCtrlDown = ctrlState == CoreVirtualKeyStates.Down || ctrlState 
        ==  (CoreVirtualKeyStates.Down | CoreVirtualKeyStates.Locked);
    if (isCtrlDown && e.Key == Windows.System.VirtualKey.C)
    {
        // Your custom keyboard accelerator behavior.
        
        e.Handled = true;
    }
 }

Zakázání akcelerátoru klávesnice

Pokud je ovládací prvek zakázaný, přidružený akcelerátor je také zakázán. V následujícím příkladu, protože vlastnost IsEnabled položky ListView je nastavena na false, přidruženou klávesovou zkratku Control+A nelze vyvolat.

<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>

Nadřazené a podřízené ovládací prvky mohou sdílet stejný zrychlovač. V tomto případě lze vyvolat nadřazený ovládací prvek i v případě, že má podřízený prvek fokus a jeho akcelerátor je zakázaný.

Čtečky obrazovky a akcelerátory klávesnice

Čtečky obrazovky, jako je Předčítání, mohou uživatelům oznámit kombinaci akceleračních kláves. Ve výchozím nastavení je to každý modifikátor (v pořadí výčtu VirtualModifiers) následovaný klíčem (a oddělen znakem +). Můžete ho přizpůsobit prostřednictvím připojené vlastnosti AcceleratorKey AutomationProperties. Pokud je zadáno více než jeden akcelerátor, oznámí se pouze první akcelerátor.

V tomto příkladu vrátí AutomationProperty.AcceleratorKey řetězec 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>   

Poznámka:

Nastavení AutomationProperties.AcceleratorKey neumožňuje funkce klávesnice, označuje pouze rozhraní UIA, které klávesy se používají.

Běžné klávesové zkratky

Doporučujeme, aby akcelerátory klávesnice byly v aplikacích pro Windows konzistentní.

Uživatelé si musí zapamatovat akcelerátory klávesnice a očekávat stejné (nebo podobné) výsledky, ale nemusí to být vždy možné kvůli rozdílům ve funkcích napříč aplikacemi.

Editace Běžný akcelerátor klávesnice
Zahájení režimu úprav Ctrl+E
Výběr všech položek v ovládacím prvku nebo okně s fokusem Ctrl+A
Hledání a nahrazení Ctrl+H
Zpět Ctrl+Z
Znovu Ctrl+Y
Odstranění výběru a zkopírování do schránky Ctrl+X
Zkopírujte výběr do schránky Ctrl+C, Ctrl+Insert
Vložte obsah schránky Ctrl+V, Shift+Insert
Vložte obsah schránky (s možnostmi) Ctrl+Alt+V
Přejmenování položky F2
Přidání nové položky Ctrl+N
Přidání nové sekundární položky Ctrl+Shift+N
Odstranit vybranou položku (s vrácením zpět) Del, Ctrl+D
Odstranit vybranou položku (bez vrácení zpět) Shift+Del
Bold Ctrl+B
Podtržení Ctrl+U
Kurzíva Ctrl+I
Navigace
Vyhledání obsahu v ovládacím prvku nebo okně s fokusem Ctrl+F
Přechod na další výsledek hledání F3
Přechod na další podokno uživatelského rozhraní F6
Přechod na předchozí podokno uživatelského rozhraní Shift+F6
Další akce
Přidání oblíbených položek Ctrl+D
Obnovit F5 nebo Ctrl +R
Přiblížit Ctrl + +
Oddálit Ctrl+-
Přiblížit na výchozí zobrazení Ctrl+0
Uložit Ctrl+S
Close Ctrl+W
Print Ctrl+P

Všimněte si, že některé kombinace nejsou platné pro lokalizované verze Systému Windows. Například ve španělské verzi Windows se pro tučné písmo místo Ctrl+B používá kombinace Ctrl+N. Pokud je aplikace lokalizovaná, doporučujeme poskytovat lokalizované akcelerátory klávesnice.

Dostupnost použitelnosti pro akcelerátory klávesnice

Nápověda

Protože akcelerátory klávesnice nejsou obvykle popsány přímo v uživatelském rozhraní aplikace pro Windows, můžete zlepšit zjistitelnost prostřednictvím popisů tlačítek, které se automaticky zobrazí, když uživatel přesune fokus, stiskne a podrží nebo najede myší na ovládací prvek. Popis může určit, jestli má ovládací prvek přidružený akcelerátor klávesnice, a pokud ano, jaká je kombinace kláves akcelerátoru.

Ve výchozím nastavení při deklaraci akcelerátorů klávesnice všechny ovládací prvky (s výjimkou MenuFlyoutItem a ToggleMenuFlyoutItem) zobrazují odpovídající kombinace kláves v popisu.

Poznámka:

Pokud má ovládací prvek definovaný více než jeden akcelerátor, zobrazí se pouze první akcelerátor.

Snímek obrazovky s tlačítkem Uložit a popiskem nad ním, který označuje podporu klávesové zkratky Ctrl+S.
Klávesová zkratka v popisku

U objektů Button, AppBarButton a AppBarToggleButton se k výchozímu popisu ovládacího prvku připojí akcelerátor klávesnice. U objektů MenuFlyoutItem a ToggleMenuFlyoutItem se zobrazí akcelerátor klávesnice společně s textem kontextové nabídky.

Poznámka:

Zadání popisu (viz Tlačítko1 v následujícím příkladu) toto chování přepíše.

<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>

Snímek obrazovky se třemi tlačítky označenými jako Button1, Button2 a Button3 a popiskem nad tlačítkem Button2, který označuje podporu klávesové zkratky Windows+B.

Kombinace kláves akcelerátoru přidána k výchozímu popisku tlačítka

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

Snímek obrazovky s tlačítkem s ikonou Disku a nápovědným popiskem, který obsahuje výchozí text 'Uložit' spojený s klávesovou zkratkou Ctrl+S v závorkách.

Kombinace kláves zrychlovače připojená k výchozímu popisku AppBarButton

<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>

Snímek obrazovky s nabídkou s položkami MenuFlyout, které obsahují kombinace kláves zrychlení.
Kombinace kláves zrychlení připojena k textu položky MenuFlyout

Řízení chování prezentace pomocí KeyboardAcceleratorPlacementMode vlastnost, která přijímá dvě hodnoty: Auto nebo Hidden.

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

V některých případech může být nutné zobrazit tip vzhledem k jinému prvku (obvykle kontejnerovému objektu).

Zde ukážeme, jak pomocí vlastnosti KeyboardAcceleratorPlacementTarget zobrazit kombinaci klávesové zkratky pro tlačítko Uložit v kontejneru Grid místo na tlačítku.

<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>

Štítky

V některých případech doporučujeme použít popisek ovládacího prvku k určení, jestli má ovládací prvek přidružený akcelerátor klávesnice, a pokud ano, jaká je kombinace kláves akcelerátoru.

Některé ovládací prvky platformy to dělají ve výchozím nastavení, konkrétně objekty MenuFlyoutItem a ToggleMenuFlyoutItem, zatímco AppBarButton a AppBarToggleButton to dělají, když se objeví v nabídce přetečení CommandBar.

Klávesové zkratky popsané v popisku položky nabídky
Klávesové zkratky uvedené v názvu položky nabídky

Výchozí text akcelerátoru pro popisek můžete přepsat pomocí vlastnosti KeyboardAcceleratorTextOverride ovládacích prvků MenuFlyoutItem, ToggleMenuFlyoutItem, AppBarButton a AppBarToggleButton (pro žádný text použijte jednu mezeru).

Poznámka:

Pokud systém nedokáže rozpoznat připojenou klávesnici, text přepsání se nezobrazí (můžete to zkontrolovat sami pomocí vlastnosti KeyboardPresent).

Pokročilé koncepty

Tady si projdeme některé aspekty akcelerátorů klávesnice na nízké úrovni.

Priorita vstupní události

Vstupní události probíhají v konkrétní sekvenci, kterou můžete zachytit a zpracovat na základě požadavků vaší aplikace.

Událost bublování KeyDown/KeyUp

V XAML se stisk klávesy zpracovává, jako by existoval pouze jeden vstupní bublající kanál. Události KeyDown/KeyUp a vstup znaků používají tento vstupní kanál. Pokud má například prvek fokus a uživatel stiskne klávesu, vyvolá se na prvku událost KeyDown, která se poté předá nadřazeným prvkům ve stromu, dokud není vlastnost args.Handled nastavena na true.

Událost KeyDown je také používána některými ovládacími prvky k implementaci integrovaných akcelerátorů ovládacích prvků. Pokud má ovládací prvek akcelerátor klávesnice, zpracovává událost KeyDown, což znamená, že událost KeyDown nebude bublinová. Například RichEditBox podporuje kopírování pomocí Ctrl+C. Při stisknutí klávesy Ctrl se aktivuje událost KeyDown a bubliny, ale když uživatel současně stiskne klávesu C, událost KeyDown se označí jako handled a není vyvolána (pokud není parametr handledEventsToo UIElement.AddHandler nastaven na hodnotu true).

Událost CharacterReceived

Když se událost CharacterReceived aktivuje po události KeyDown pro textové ovládací prvky, jako je TextBox, můžete zrušit vstup znaků v obslužné rutině události KeyDown.

Události PreviewKeyDown a PreviewKeyUp

Vstupní události náhledu se aktivují před všemi dalšími událostmi. Pokud tyto události nezpracujete, nejprve se aktivuje akcelerátor prvku, který má fokus, a následně dojde k události KeyDown. Obě události se šíří, dokud nejsou zpracovány.

Diagram znázorňující klíčovou posloupnost událostí Klíčová posloupnost událostí

Pořadí událostí:

Náhled událostí KeyDownu

Akcelerátor aplikací
OnKeyDown – metoda
Událost KeyDown
Akcelerátory aplikací ve vztahu k nadřazenému objektu
OnKeyDown – metoda u nadřazeného objektu
Událost KeyDown u nadřazeného objektu
(Bubliny ke kořeni)

CharacterReceived – událost
Události PreviewKeyUp
KeyUpEvents

Když je událost akcelerátoru zpracována, označí se také událost KeyDown jako vyřízená. Událost KeyUp zůstává neošetřená.

Řešení akcelerátorů

Událost akcelerátoru klávesnice postupuje z prvku, který má fokus, až ke kořeni. Pokud událost není zpracována, architektura XAML hledá jiné nesvázané aplikační akcelerátory mimo bublinové trasy.

Pokud jsou definovány dva akcelerátory klávesnice se stejnou kombinací kláves, vyvolá se první akcelerátor klávesnice nalezený ve vizuálním stromu.

Klávesové akcelerátory omezené na určitý obor se vyvolávají jen tehdy, když je fokus uvnitř konkrétní oblasti. Například v mřížce, která obsahuje desítky ovládacích prvků, lze pro ovládací prvek vyvolat akcelerátor klávesnice pouze v případě, že fokus je v mřížce (vlastník rozsahu).

Vymezení akcelerátorů programově

UiElement.TryInvokeKeyboardAccelerator metoda vyvolá všechny odpovídající akcelerátory v podstromu elementu.

Metoda UIElement.OnProcessKeyboardAccelerators se spustí před akcelerátorem klávesnice. Tato metoda předá ProcessKeyboardAcceleratorArgs objekt, který obsahuje klíč, modifikátor a logickou hodnotu označující, zda je akcelerátor klávesnice zpracován. Pokud je označený jako zpracovaný, bubliny akcelerátoru klávesnice (takže vnější akcelerátor klávesnice se nikdy nevyvolá).

Poznámka:

OnProcessKeyboardAccelerators se vždy aktivuje bez ohledu na to, jestli se zpracovává nebo ne (podobá se události OnKeyDown). Musíte zkontrolovat, jestli byla událost označena jako zpracována.

V tomto příkladu používáme OnProcessKeyboardAccelerators a TryInvokeKeyboardAccelerator k určení rozsahu akcelerátorů klávesnice na objekt Page:

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

Lokalizace akcelerátorů

Doporučujeme lokalizovat všechny akcelerátory klávesnice. Můžete to provést pomocí standardního souboru prostředků (.resw) a atributu x:Uid v deklaracích XAML. V tomto příkladu prostředí Windows Runtime automaticky načte prostředky.

Diagram lokalizace akcelerátoru klávesnice se souborem prostředků Lokalizace akcelerátoru klávesnice se souborem prostředků

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

Poznámka:

Akcelerátory klávesnice se implementují jako virtuální klávesy. Lokalizované akcelerátory musí být vybrány z předdefinované kolekce kódůVirtual-Key (jinak dojde k chybě analyzátoru XAML).

Programové nastavení akcelerátoru

Tady je příklad programového definování akcelerátoru:

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

Poznámka:

KeyboardAccelerator není možné sdílet, stejný KeyboardAccelerator nelze přidat do více prvků.

Potlačení chování akcelerátoru klávesnice

Můžete zpracovat Událost KeyboardAccelerator.Invoked, která nahradí výchozí chování KeyboardAccelerator.

Tento příklad ukazuje, jak přepsat příkaz "Vybrat vše" (Ctrl+A akcelerátor klávesnice) ve vlastním ovládacím prvku ListView. Vlastnost Handled jsme také nastavili na hodnotu true, aby se zastavila propagace události.

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