Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Klawisze przyspieszające (lub akceleratory klawiatury) to skróty klawiaturowe, które zwiększają użyteczność i dostępność aplikacji systemu Windows, oferując intuicyjny sposób, w jaki użytkownicy mogą wywoływać typowe działania lub polecenia bez nawigowania po interfejsie aplikacji.
Uwaga / Notatka
Klawiatura jest niezbędna dla użytkowników z pewnymi niepełnosprawnościami (zobacz Ułatwienia dostępu za pomocą klawiatury), a także jest ważnym narzędziem dla użytkowników, którzy wolą go jako bardziej wydajny sposób interakcji z aplikacją.
Zobacz temat Klucze dostępu, aby uzyskać szczegółowe informacje na temat nawigowania po interfejsie użytkownika aplikacji systemu Windows ze skrótami klawiaturowymi.
Aby utworzyć własne niestandardowe skróty klawiaturowe, zobacz temat Zdarzenia klawiatury .
Przegląd
Akceleratory składają się z dwóch typów kluczy: modyfikatorów i niemodyfikatorów. Klawisze modyfikujące obejmują Shift, Menu, Control i klawisz Windows, które są udostępniane poprzez VirtualKeyModifiers. Niemodyfikatory obejmują dowolny klucz wirtualny, taki jak Delete, F3, Spacja, Strzałka, Esc oraz wszystkie klucze alfanumeryczne i interpunkcyjne.
Uwaga / Notatka
Akceleratory zazwyczaj obejmują klawisze funkcyjne F1 do F12 lub pewne kombinacje standardowego klawisza sparowanego z co najmniej jednym klawiszem modyfikującym (CTRL, Shift). Jeśli na przykład użytkownik naciska Ctrl+Shift+M, struktura sprawdza modyfikatory (Ctrl i Shift) i uruchamia akcelerator, jeśli istnieje.
Wiele kontrolek XAML ma wbudowane akceleratory klawiatury. Na przykład ListView obsługuje Ctrl+A do wybierania wszystkich elementów na liście, a RichEditBox obsługuje Ctrl+Tab do wstawiania tabulatora w polu tekstowym. Te wbudowane akceleratory klawiaturowe są określane jako akceleratory sterujące i są wykonywane tylko wtedy, gdy fokus znajduje się na elemecie lub jednym z jego elementów podrzędnych. Akceleratory zdefiniowane przez ciebie przy użyciu interfejsów API akceleratora klawiatury omówione tutaj są określane jako akceleratory aplikacji.
Akceleratory klawiatury nie są dostępne dla każdej akcji, ale są często skojarzone z poleceniami uwidocznianymi w menu (i powinny być określone z zawartością elementu menu). Akceleratory mogą być również skojarzone z akcjami, które nie mają równoważnych elementów menu. Jednak ze względu na to, że użytkownicy korzystają z menu aplikacji w celu odnajdywania i poznawania dostępnego zestawu poleceń, należy jak najbardziej ułatwić odnajdywanie akceleratorów (użycie etykiet lub ustalonych wzorców może pomóc w tym).
Akcelerator automatycznie powtarza się (na przykład gdy użytkownik naciska Ctrl+Shift, a następnie przytrzymuje M, akcelerator jest uruchamiany wielokrotnie do momentu zwolnienia klawisza M). Tego zachowania nie można zmodyfikować.
Akceleratory klawiatury opisane w etykiecie elementu menu
Kiedy należy używać akceleratorów klawiatury
Zalecamy określenie akceleratorów klawiatury wszędzie tam, gdzie jest to odpowiednie w interfejsie użytkownika, i obsługę akceleratorów we wszystkich kontrolkach niestandardowych.
Akceleratory klawiatury sprawiają, że aplikacja jest bardziej dostępna dla użytkowników niepełnosprawnych ruchowo, w tym dla użytkowników, którzy mogą naciskać tylko jeden naraz lub mieć trudności z użyciem myszy.
Dobrze zaprojektowany interfejs użytkownika klawiatury jest ważnym aspektem ułatwień dostępu do oprogramowania. Umożliwia użytkownikom upośledzenie wzroku lub osobom niepełnosprawnym ruchowym nawigowanie po aplikacji i interakcję z jej funkcjami. Tacy użytkownicy mogą nie być w stanie obsługiwać myszy i zamiast tego polegać na różnych technologiach pomocniczych, takich jak narzędzia do ulepszania klawiatury, klawiatury ekranowe, powiększacze ekranu, czytniki ekranu i narzędzia wprowadzania głosu. W przypadku tych użytkowników kluczowe jest kompleksowe pokrycie poleceń.
Akceleratory klawiatury sprawiają, że aplikacja staje się bardziej użyteczna dla użytkowników, którzy wolą korzystać z klawiatury.
Doświadczeni użytkownicy często mają silne preferencje dotyczące używania klawiatury, ponieważ polecenia oparte na klawiaturze można wprowadzać szybciej i nie wymagają od nich usunięcia rąk z klawiatury. Dla tych użytkowników kluczowe znaczenie mają wydajność i spójność; kompleksowość jest ważna tylko w przypadku najczęściej używanych poleceń.
Określanie akceleratora klawiatury
Użyj interfejsów API akceleratora klawiaturowego, aby utworzyć akceleratory klawiaturowe w aplikacjach systemu Windows. Dzięki tym interfejsom API nie trzeba obsługiwać wielu zdarzeń KeyDown do wykrywania naciśniętych kombinacji klawiszy, a akceleratory można lokalizować w zasobach aplikacji.
Zalecamy ustawienie akceleratorów klawiatury dla najbardziej typowych akcji w aplikacji i udokumentowanie ich przy użyciu etykiety elementu menu lub etykietki narzędzia. W tym przykładzie deklarujemy akceleratory klawiatury tylko dla poleceń Zmień nazwę i Kopiuj.
<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>
Akcelerator klawiatury opisany w etykietce narzędzia
Obiekt UIElement ma kolekcję KeyboardAccelerator , KeyboardAccelerators, gdzie określasz niestandardowe obiekty KeyboardAccelerator i zdefiniuj naciśnięcia dla akceleratora klawiatury:
Klucz — klucz wirtualny używany jako akcelerator klawiatury.
Modyfikatory — VirtualKeyModifiers modyfikatory stosowane do akceleratora klawiatury. Jeśli modyfikatory nie są ustawione, wartość domyślna to Brak.
Uwaga / Notatka
Obsługiwane są skróty klawiaturowe pojedynczego klawisza (A, Delete, F2, Spacja, Esc, Klucz multimedialny) oraz skróty wieloklawiszowe (Ctrl+Shift+M). Jednak klucze wirtualne gamepad nie są obsługiwane.
Akceleratory o określonym zakresie
Niektóre akceleratory działają tylko w określonych zakresach, podczas gdy inne działają w całej aplikacji.
Na przykład program Microsoft Outlook zawiera następujące akceleratory:
- Ctrl+B, Ctrl+I i ESC działają tylko w zakresie formularza wysyłania wiadomości e-mail
- Ctrl+1 i Ctrl+2 działają w całej aplikacji
Menu kontekstowe
Akcje menu kontekstowego mają wpływ tylko na określone obszary lub elementy, takie jak zaznaczone znaki w edytorze tekstów lub piosenka na liście odtwarzania. Z tego powodu zalecamy ustawienie zakresu akceleratorów klawiatury dla elementów menu kontekstowego na element nadrzędny menu kontekstowego.
Użyj właściwości ScopeOwner , aby określić zakres akceleratora klawiatury. Ten kod pokazuje, jak zaimplementować menu kontekstowe na ListView z akceleratorami klawiatury o zdefiniowanym zakresie.
<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>
Atrybut ScopeOwner elementu MenuFlyoutItem.KeyboardAccelerators oznacza, że akcelerator jest ograniczony w zakresie, a nie globalny (wartość domyślna to null, czyli globalny). Aby uzyskać więcej informacji, zobacz sekcję Rozwiązywanie akceleratorów w dalszej części tego tematu.
Wywoływanie akceleratora klawiatury
Obiekt KeyboardAccelerator używa wzorca kontrolki UI Automation (UIA) do wykonywania akcji po aktywowaniu akceleratora.
UIA [wzorce kontrolek] uwidacznia typowe funkcje sterowania. Na przykład kontrolka Przycisk implementuje wzorzec kontrolki Wywołaj w celu obsługi zdarzenia kliknięcia (zazwyczaj kontrolka jest wywoływana przez kliknięcie, dwukrotne kliknięcie, naciśnięcie Enter, użycie wstępnie zdefiniowanego skrótu klawiaturowego lub inną kombinację naciśnięć klawiszy). Gdy akcelerator klawiatury jest używany do wywoływania kontrolki, platforma XAML sprawdza, czy kontrolka implementuje wzorzec Invoke, a jeśli tak, aktywuje ją (nie jest konieczne nasłuchiwanie zdarzenia KeyboardAcceleratorInvoked).
W poniższym przykładzie kontrolka+S wyzwala zdarzenie Click, ponieważ przycisk implementuje wzorzec Invoke.
<Button Content="Save" Click="OnSave">
<Button.KeyboardAccelerators>
<KeyboardAccelerator Key="S" Modifiers="Control" />
</Button.KeyboardAccelerators>
</Button>
Jeśli element implementuje wiele wzorców sterowania, tylko jeden można aktywować za pomocą akceleratora. Wzorce kontrolek są priorytetyzowane w następujący sposób:
- Wywołaj (Przycisk)
- Przełącz (pole wyboru)
- Wybór (ListView)
- Rozwiń/zwiń (ComboBox)
Jeśli nie określono dopasowania, akcelerator jest nieprawidłowy i zostanie podany komunikat debugowania ("Nie znaleziono wzorców automatyzacji dla tego komponentu. Implementuj wszystkie pożądane zachowania w zdarzeniu Invoked. Ustawienie 'Handled' na wartość true w obsłudze zdarzenia tłumi ten komunikat").
Niestandardowe zachowanie akceleratora klawiatury
Zdarzenie Invoked obiektu KeyboardAccelerator jest wywoływane, gdy akcelerator jest uruchamiany. Obiekt zdarzenia KeyboardAcceleratorInvokedEventArgs zawiera następujące właściwości:
- Obsłużone (typ logiczny): ustawienie tej wartości na true uniemożliwia zdarzeniu uruchomienie wzorca kontrolki i zatrzymuje propagację zdarzeń akceleratora. Wartość domyślna to false.
- Element (DependencyObject): obiekt skojarzony z akceleratorem.
- KeyboardAccelerator: Akcelerator klawiatury używany do wywołania zdarzenia Invoked.
W tym miejscu pokazano, jak zdefiniować kolekcję akceleratorów klawiatury dla elementów w ListView oraz jak obsługiwać zdarzenie 'Invoked' dla każdego akceleratora.
<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;
}
Nadpisywanie domyślnego działania klawiatury
Niektóre kontrolki, gdy mają fokus, obsługują wbudowane akceleratory klawiaturowe, które zastępują dowolny akcelerator zdefiniowany przez aplikację. Na przykład gdy kontrolka TextBox ma fokus, akcelerator Control+C kopiuje tylko aktualnie zaznaczony tekst (akceleratory zdefiniowane przez aplikację są ignorowane i nie są wykonywane żadne inne funkcje).
Chociaż nie zalecamy zastępowania domyślnych zachowań elementów sterujących ze względu na przyzwyczajenia i oczekiwania użytkowników, można zastąpić wbudowany akcelerator klawiatury elementu sterującego. W poniższym przykładzie pokazano, jak zastąpić akcelerator klawiatury Control+C dla kontrolki TextBox za pomocą procedury obsługi zdarzeń 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;
}
}
Wyłączanie akceleratora klawiatury
Jeśli kontrolka jest wyłączona, skojarzony akcelerator jest również wyłączony. W poniższym przykładzie, ponieważ właściwość IsEnabled elementu ListView jest ustawiona na wartość false, nie można wywołać skojarzonego akceleratora Control+A.
<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>
Kontrolki nadrzędne i podrzędne mogą współużytkować ten sam akcelerator. W takim przypadku można wywołać kontrolkę nadrzędną, nawet jeśli element podrzędny ma fokus, a jego akcelerator jest wyłączony.
Czytniki zawartości ekranu i akceleratory klawiatury
Czytniki ekranu, takie jak Narrator, mogą ogłosić kombinację klawiszy przyspieszających klawiatury użytkownikom. Domyślnie jest to każdy modyfikator (w kolejności wyliczenia VirtualModifiers), po którym następuje klucz, oddzielony znakiem "+". Można to dostosować za pomocą dołączonej właściwości AcceleratorKey AutomationProperties. Jeśli określono więcej niż jeden akcelerator, zostanie ogłoszony tylko pierwszy.
W tym przykładzie element AutomationProperty.AcceleratorKey zwraca ciąg "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>
Uwaga / Notatka
Ustawienie AutomationProperties.AcceleratorKey nie włącza funkcji klawiatury, a jedynie wskazuje frameworkowi UIA, które klawisze są używane.
Typowe akceleratory klawiatury
Zalecamy, aby akceleratory klawiatury były spójne w aplikacjach systemu Windows.
Użytkownicy muszą zapamiętywać akceleratory klawiatury i oczekiwać tych samych (lub podobnych) wyników, ale może to nie zawsze być możliwe ze względu na różnice w funkcjonalności w aplikacjach.
| Edycja | Wspólny akcelerator klawiatury |
|---|---|
| Rozpocznij tryb edycji | Ctrl + E |
| Zaznacz wszystkie elementy w skoncentrowanej kontrolce lub oknie | Ctrl + A |
| Wyszukiwanie i zastępowanie | Ctrl + H |
| Cofnąć | Ctrl + Z |
| Powtórz | Ctrl + Y |
| Usuń zaznaczenie i skopiuj je do schowka | Ctrl + X |
| Skopiuj zaznaczenie do schowka | Ctrl + C, Ctrl + Insert |
| Wklej zawartość schowka | Ctrl + V, Shift + Insert |
| Wklej zawartość schowka (z opcjami) | Ctrl + Alt + V |
| Zmienianie nazwy elementu | F2 |
| Dodawanie nowego elementu | Ctrl + N |
| Dodawanie nowego elementu pomocniczego | Ctrl + Shift + N |
| Usuń wybrany element (z możliwością cofnięcia) | Del, Ctrl+D |
| Usuń wybrany element (bez cofania) | Shift + Del |
| Pogrubiona | Ctrl + B |
| Podkreślenie | Ctrl + U |
| Italik | Ctrl + I |
| Nawigacja | |
| Znajdowanie zawartości w skoncentrowanej kontrolce lub oknie | Ctrl + F |
| Przejdź do następnego wyniku wyszukiwania | F3 |
| Przejdź do następnego okienka interfejsu użytkownika | F6 |
| Przejdź do poprzedniego okienka interfejsu użytkownika | Shift + F6 (skrót klawiszowy) |
| Inne akcje | |
| Dodawanie ulubionych | Ctrl + D |
| Odśwież | F5 lub Ctrl + R |
| Powiększ | Ctrl + + |
| Pomniejszanie | Ctrl + - |
| Powiększenie do widoku domyślnego | Ctrl + 0 |
| Zapisz | Ctrl + S |
| Close | Ctrl + W |
| Drukować | Ctrl + P |
Zwróć uwagę, że niektóre kombinacje są nieprawidłowe dla zlokalizowanych wersji systemu Windows. Na przykład w hiszpańskiej wersji systemu Windows ctrl+N jest używany do pogrubienia zamiast Ctrl+B. Zalecamy udostępnianie zlokalizowanych akceleratorów klawiatury, jeśli aplikacja jest zlokalizowana.
Przystępność cenowa akceleratorów klawiatury
Tooltips
Ponieważ akceleratory klawiatury nie są zwykle opisywane bezpośrednio w interfejsie użytkownika aplikacji systemu Windows, można poprawić odnajdywanie za pomocą etykietek narzędzi, które są wyświetlane automatycznie, gdy użytkownik przenosi fokus, naciska i trzyma wskaźnik myszy nad kontrolką. Podpowiedź może określić, czy kontrolka ma przypisany akcelerator klawiatury, a jeśli tak, to jaka jest kombinacja klawiszy dla tego akceleratora.
Windows 10, wersja 1803 (aktualizacja z kwietnia 2018 r.) i nowsze
Domyślnie po zadeklarowaniu przyspieszeń klawiatury wszystkie kontrolki (z wyjątkiem MenuFlyoutItem i ToggleMenuFlyoutItem) wyświetlają odpowiednie kombinacje w podpowiedziach.
Uwaga / Notatka
Jeśli kontrolka ma zdefiniowany więcej niż jeden akcelerator, wyświetlany jest tylko pierwszy.
Kombi akceleratora w etykietce narzędzia
W przypadku obiektów Button, AppBarButton i AppBarToggleButton akcelerator klawiatury jest dołączany do domyślnej etykietki narzędzia kontrolki. W przypadku obiektów MenuFlyoutItem i ToggleMenuFlyoutItem akcelerator klawiatury jest wyświetlany z tekstem wysuwany.
Uwaga / Notatka
Określenie podpowiedzi (zobacz Przycisk1 w poniższym przykładzie) zastępuje to zachowanie.
<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>
Kombinacja klawiszy akceleratora dodawana do domyślnego podpowiedzi przycisku
<AppBarButton Icon="Save" Label="Save">
<AppBarButton.KeyboardAccelerators>
<KeyboardAccelerator Key="S" Modifiers="Control"/>
</AppBarButton.KeyboardAccelerators>
</AppBarButton>
Kombinacja akceleratora dołączona do domyślnej etykietki narzędzia 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>
Skrót klawiszowy dołączony do tekstu MenuFlyoutItem
Kontrolowanie zachowania prezentacji przy użyciu właściwości KeyboardAcceleratorPlacementMode , która akceptuje dwie wartości: Auto lub Hidden.
<Button Content="Save" Click="OnSave" KeyboardAcceleratorPlacementMode="Auto">
<Button.KeyboardAccelerators>
<KeyboardAccelerator Key="S" Modifiers="Control" />
</Button.KeyboardAccelerators>
</Button>
W niektórych przypadkach może być konieczne umieszczenie podpowiedzi w odniesieniu do innego elementu (zazwyczaj obiektu kontenera).
W tym miejscu pokazano, jak za pomocą właściwości KeyboardAcceleratorPlacementTarget wyświetlić kombinację skrótu klawiatury dla przycisku Zapisz za pomocą kontenera Grid zamiast przycisku.
<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>
Etykiety
W niektórych przypadkach zalecamy użycie etykiety kontrolki w celu określenia, czy kontrolka ma skojarzony akcelerator klawiatury i, jeśli tak, jaka jest kombinacja akceleratora.
Niektóre kontrolki platformy domyślnie to robią, a w szczególności obiekty MenuFlyoutItem i ToggleMenuFlyoutItem, podczas gdy AppBarButton i AppBarToggleButton robią to, gdy są wyświetlane w menu przepełnienia CommandBar.
Akceleratory klawiatury opisane w etykiecie elementu menu
Można zastąpić domyślny tekst akceleratora etykiety za pomocą właściwości KeyboardAcceleratorTextOverride dla kontrolki MenuFlyoutItem, ToggleMenuFlyoutItem, AppBarButton i AppBarToggleButton (użyj pojedynczej spacji, aby nie wyświetlać tekstu).
Uwaga / Notatka
Tekst przesłaniania nie jest wyświetlany, jeśli system nie może wykryć dołączonej klawiatury (możesz to sprawdzić samodzielnie za pomocą właściwości KeyboardPresent).
Pojęcia zaawansowane
W tym miejscu zapoznamy się z pewnymi niskimi aspektami akceleratorów klawiatury.
Priorytet zdarzenia wejściowego
Zdarzenia wejściowe występują w określonej sekwencji, którą można przechwycić i obsłużyć na podstawie wymagań aplikacji.
Zdarzenie Bubbling KeyDown/KeyUp
W języku XAML naciśnięcie klawisza jest przetwarzane tak, jakby istniał tylko jeden potok wprowadzania. Ten przepływ danych jest używany przez zdarzenia KeyDown/KeyUp i wprowadzanie znaków. Jeśli na przykład element ma fokus, a użytkownik naciska klawisz, zdarzenie KeyDown jest wywoływane na tym elemencie, a następnie na jego elemencie nadrzędnym, i tak dalej w górę drzewa, aż do momentu, kiedy właściwość args.Handled przyjmie wartość true.
Zdarzenie KeyDown jest również używane przez niektóre kontrolki do implementowania wbudowanych akceleratorów sterowania. Gdy kontrolka ma akcelerator klawiatury, obsługuje zdarzenie KeyDown, co oznacza, że nie będzie propagacji zdarzenia KeyDown. Na przykład aplikacja RichEditBox obsługuje kopiowanie za pomocą Ctrl+C. Po naciśnięciu Ctrl zdarzenie KeyDown jest uruchamiane i rozprzestrzenia się, ale gdy użytkownik naciska jednocześnie C, zdarzenie KeyDown jest oznaczane jako Obsługiwane i nie rozprzestrzenia się dalej (chyba że parametr handledEventsToo funkcji UIElement.AddHandler jest ustawiony na true).
Zdarzenie CharacterReceived
Ponieważ zdarzenie CharacterReceived jest wyzwalane po zdarzeniu KeyDown dla kontrolek tekstowych, takich jak TextBox, możesz anulować wprowadzanie znaków w procedurze obsługi zdarzeń KeyDown.
Zdarzenia PreviewKeyDown i PreviewKeyUp
Zdarzenia wejściowe podglądu są wyzwalane przed wszelkimi innymi zdarzeniami. Jeśli nie obsłużysz tych zdarzeń, najpierw zostanie wyzwolony akcelerator elementu, który jest aktywny, a następnie wystąpi zdarzenie KeyDown. Oba zdarzenia bąbelkują, dopóki nie zostaną obsłużone.
Kluczowa sekwencja zdarzeń
Kolejność zdarzeń:
Podgląd zdarzeń KeyDown
…
Akcelerator aplikacji
metoda onkeydown
Zdarzenie KeyDown
Akceleratory aplikacji w obiekcie nadrzędnym
Metoda OnKeyDown w obiekcie nadrzędnym
Zdarzenie KeyDown w obiekcie nadrzędnym
(Bąbelki do korzenia)
…
Zdarzenie CharacterReceived
Zdarzenia PreviewKeyUp
KeyUpEvents
Po obsłużeniu zdarzenia akceleratora zdarzenie KeyDown zostaje również oznaczone jako obsłużone. Zdarzenie KeyUp pozostaje nieobsługiwane.
Rozwiązywanie akceleratorów
Zdarzenie skrótu klawiaturowego przechodzi od elementu z fokusem do korzenia. Jeśli zdarzenie nie jest obsługiwane, struktura XAML szuka innych akceleratorów aplikacji niezakresowych poza ścieżką bubbling.
Gdy dwa akceleratory klawiatury są zdefiniowane przy użyciu tej samej kombinacji, wywoływany jest pierwszy akcelerator klawiatury znajdujący się w drzewie wizualnym.
Akceleratory klawiatury o określonym zakresie są wywoływane tylko wtedy, gdy fokus znajduje się wewnątrz określonego zakresu. Na przykład w Gridzie zawierającym dziesiątki kontrolek akcelerator klawiatury można wywołać dla kontrolki tylko wtedy, gdy fokus znajduje się wewnątrz Grida (właściciel zakresu).
Programowe definiowanie zakresu akceleratorów
Metoda UIElement.TryInvokeKeyboardAccelerator wywołuje wszystkie pasujące akceleratory w poddrzewie elementu.
Metoda UIElement.OnProcessKeyboardAccelerators jest wykonywana przed akceleratorem klawiatury. Ta metoda przekazuje obiekt ProcessKeyboardAcceleratorArgs zawierający klucz, modyfikator i wartość logiczną wskazującą, czy akcelerator klawiatury jest obsługiwany. Jeśli są oznaczone jako obsługiwane, bąbelki akceleratora klawiatury (więc zewnętrzny akcelerator klawiatury nigdy nie jest wywoływany).
Uwaga / Notatka
OnProcessKeyboardAccelerators zawsze się uruchamia, niezależnie od tego, czy są obsługiwane przez program (podobnie jak zdarzenie OnKeyDown). Należy sprawdzić, czy zdarzenie zostało oznaczone jako obsługiwane.
W tym przykładzie używamy poleceń OnProcessKeyboardAccelerators i TryInvokeKeyboardAccelerator, aby ograniczyć zakres akceleratorów klawiatury do obiektu Page:
protected override void OnProcessKeyboardAccelerators(
ProcessKeyboardAcceleratorArgs args)
{
if(args.Handled != true)
{
this.TryInvokeKeyboardAccelerator(args);
args.Handled = true;
}
}
Lokalizowanie akceleratorów
Zalecamy lokalizowanie wszystkich akceleratorów klawiatury. Można to zrobić za pomocą pliku zasobów standardowych (resw) i atrybutu x:Uid w deklaracjach XAML. W tym przykładzie środowisko uruchomieniowe systemu Windows automatycznie ładuje zasoby.
Lokalizacja akceleratora klawiatury z plikiem zasobów
<Button x:Uid="myButton" Click="OnSave">
<Button.KeyboardAccelerators>
<KeyboardAccelerator x:Uid="myKeyAccelerator" Modifiers="Control"/>
</Button.KeyboardAccelerators>
</Button>
Uwaga / Notatka
Akceleratory klawiatury są implementowane jako klawisze wirtualne. Zlokalizowane akceleratory należy wybrać ze wstępnie zdefiniowanej kolekcji kodówVirtual-Key (w przeciwnym razie wystąpi błąd analizatora XAML).
Programowe konfigurowanie akceleratora
Oto przykład programowego definiowania akceleratora:
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);
}
Uwaga / Notatka
KlawiaturaAccelerator nie jest współużytkowalna. Nie można dodać tego samego modułu KlawiaturaAccelerator do wielu elementów.
Zastępowanie zachowania akceleratora klawiatury
Możesz obsłużyć zdarzenie KeyboardAccelerator.Invoked, aby zastąpić domyślne zachowanie KeyboardAccelerator.
W tym przykładzie pokazano, jak zastąpić polecenie „Zaznacz wszystko” (kombinacja klawiszy Ctrl+A) w niestandardowej kontrolce ListView. Ustawiliśmy również właściwość Handled na true, aby zatrzymać dalsze propagowanie zdarzenia.
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;
}
}
…
}
Powiązane artykuły
Samples
Windows developer