Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Sneltoetsen (of toetsenbordversnellers) zijn sneltoetsen die de bruikbaarheid en toegankelijkheid van uw Windows-toepassingen verbeteren door gebruikers een intuïtieve manier te bieden om algemene acties of opdrachten aan te roepen zonder door de gebruikersinterface van de app te navigeren.
Opmerking
Een toetsenbord is onmisbaar voor gebruikers met een bepaalde handicap (zie Toetsenbordtoegankelijkheid) en is ook een belangrijk hulpmiddel voor gebruikers die er de voorkeur aan geven als een efficiëntere manier om met een app te communiceren.
Zie het onderwerp Toegangstoetsen voor meer informatie over het navigeren in de gebruikersinterface van een Windows-toepassing met sneltoetsen.
Als u uw eigen aangepaste sneltoetsen wilt maken, raadpleegt u het onderwerp Toetsenbordevenementen .
Overzicht
Accelerators bestaan uit twee typen toetsen: modificatoren en niet-modificatoren. Modifier-toetsen zijn Shift, Menu, Control en de Windows-toets, die beschikbaar zijn via VirtualKeyModifiers. Niet-modificatietoetsen zijn elke VirtualKey, zoals verwijderen, F3, spatiebalk, pijltoetsen, Esc en de alfanumerieke en interpunctietoetsen.
Opmerking
Accelerators omvatten doorgaans de functietoetsen F1 tot en met F12 of een combinatie van een standaardtoets die is gekoppeld aan een of meer wijzigingstoetsen (Ctrl, Shift). Als een gebruiker bijvoorbeeld op Ctrl+Shift+M drukt, controleert het framework de modifiers (Ctrl en Shift) en wordt de accelerator geactiveerd, als deze bestaat.
Veel XAML-besturingselementen hebben ingebouwde toetsenbordversnellers. ListView ondersteunt bijvoorbeeld Ctrl+A voor het selecteren van alle items in de lijst en RichEditBox ondersteunt Ctrl+Tab voor het invoegen van een tab in het tekstvak. Deze ingebouwde toetsenbordversnellers worden besturingsversnellers genoemd en worden alleen uitgevoerd als het element of een van de ondergeschikte elementen de focus heeft. Accelerators die door u zijn gedefinieerd met behulp van de API's van de toetsenbordversneller die hier worden besproken, worden app-accelerators genoemd.
Toetsenbordversnellers zijn niet beschikbaar voor elke actie, maar zijn vaak gekoppeld aan opdrachten die worden weergegeven in menu's (en moeten worden opgegeven met de inhoud van het menu-item). Accelerators kunnen ook worden gekoppeld aan acties waarvoor geen equivalente menuopties bestaan. Omdat gebruikers echter afhankelijk zijn van menu's van een toepassing om de beschikbare opdrachtenset te detecteren en te leren, moet u proberen om de detectie van accelerators zo eenvoudig mogelijk te maken (met behulp van labels of vastgestelde patronen kan dit helpen).
Een accelerator herhaalt automatisch (bijvoorbeeld wanneer de gebruiker op Ctrl+Shift drukt en vervolgens M ingedrukt houdt, wordt de accelerator herhaaldelijk aangeroepen totdat M wordt vrijgegeven). Dit gedrag kan niet worden gewijzigd.
Toetsenbordversnellers die worden beschreven in een menu-itemlabel
Wanneer gebruikt u toetsenbordversnellers
Het is aan te raden om waar mogelijk toetsenbordversnellers aan te geven in uw gebruikersinterface en om accelerators te ondersteunen in alle aangepaste bedieningscomponenten.
Toetsenbordversnellers maken uw app toegankelijker voor gebruikers met een motorische beperking, waaronder gebruikers die slechts één toets tegelijk kunnen drukken of moeite hebben met het gebruik van een muis.
Een goed ontworpen toetsenbordinterface is een belangrijk aspect van softwaretoegankelijkheid. Hiermee kunnen gebruikers met visuele beperkingen of met bepaalde motorische handicaps door een app navigeren en werken met de functies ervan. Dergelijke gebruikers kunnen mogelijk geen muis bedienen en in plaats daarvan afhankelijk zijn van verschillende ondersteunende technologieën, zoals hulpprogramma's voor toetsenbordverbetering, schermtoetsenbord, schermvergrotingen, schermlezers en hulpprogramma's voor spraakinvoer. Voor deze gebruikers is uitgebreide opdrachtdekking cruciaal.
Toetsenbordversnellers maken uw app bruikbaarder voor power-gebruikers die liever via het toetsenbord werken.
Ervaren gebruikers hebben vaak een sterke voorkeur voor het gebruik van het toetsenbord, omdat opdrachten op basis van het toetsenbord sneller kunnen worden ingevoerd en ze niet nodig hebben om hun handen van het toetsenbord te verwijderen. Voor deze gebruikers zijn efficiëntie en consistentie cruciaal; uitgebreidheid is alleen belangrijk voor de meest gebruikte opdrachten.
Een toetsenbordversneller opgeven
Gebruik de KeyboardAccelerator-API's om toetsenbordversnellers te maken in Windows-apps. Met deze API's hoeft u niet meerdere KeyDown-gebeurtenissen af te handelen om de toetsencombinatie te detecteren die is ingedrukt en kunt u accelerators in de app-resources lokaliseren.
U wordt aangeraden toetsenbordversnellers in te stellen voor de meest voorkomende acties in uw app en deze te documenteren met behulp van het label of de knopinfo van het menu-item. In dit voorbeeld declareren we alleen toetsenbordversnellers voor de opdrachten Naam wijzigen en Kopiëren.
<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>
Toetsenbordversneller beschreven in knopinfo
Het UIElement-object heeft een verzameling KeyboardAccelerator , KeyboardAccelerators, waar u uw aangepaste KeyboardAccelerator-objecten opgeeft en de toetsaanslagen voor de toetsenbordversneller definieert:
Toets : de VirtualKey die wordt gebruikt voor de toetsenbordversneller.
Modifiers : de VirtualKeyModifiers die worden gebruikt voor de toetsenbordversneller. Als modifiers niet zijn ingesteld, is de standaardwaarde Geen.
Opmerking
Eén toets (A, Delete, F2, spatiebalk, Esc, Multimediatoets) en multi-key accelerators (Ctrl+Shift+M) worden ondersteund. Virtuele Gamepad-sleutels worden echter niet ondersteund.
Scoped accelerators
Sommige accelerators werken alleen in specifieke toepassingsbereiken, terwijl andere applicatie-breed werken.
Microsoft Outlook bevat bijvoorbeeld de volgende accelerators:
- Ctrl+B, Ctrl+I en ESC werken alleen binnen het bereik van het formulier voor het verzenden van e-mail
- Ctrl+1 en Ctrl+2 werken app-breed
Contextmenu
Contextmenuacties zijn alleen van invloed op specifieke gebieden of elementen, zoals de geselecteerde tekens in een teksteditor of een nummer in een afspeellijst. Daarom raden we u aan om het bereik van toetsenbordversnellers voor contextmenu-items in te stellen op het bovenliggende menu van het contextmenu.
Gebruik de eigenschap ScopeOwner om het bereik van de toetsenbordversneller op te geven. Deze code laat zien hoe u een contextmenu implementeert in een ListView met scoped toetsenbordversnellers:
<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>
Het kenmerk ScopeOwner van het element MenuFlyoutItem.KeyboardAccelerators markeert de accelerator als gescopeerd in plaats van globaal (de standaardwaarde is null of globaal). Zie de sectie Oplossingsversnellers verderop in dit onderwerp voor meer informatie.
Een toetsenbordversneller aanroepen
Het KeyboardAccelerator-object maakt gebruik van het UIA-besturingspatroon (UI Automation) om actie te ondernemen wanneer een accelerator wordt aangeroepen.
De UIA [besturingspatronen] bieden algemene besturingsfunctionaliteit. Het besturingselement Knop implementeert bijvoorbeeld het patroon Aanroepen om de klikgebeurtenis te ondersteunen (meestal wordt een besturingselement aangeroepen door te klikken, te dubbelklikken of op Enter te drukken, een vooraf gedefinieerde sneltoets of een andere combinatie van toetsaanslagen). Wanneer een toetsenbordversneller wordt gebruikt om een besturingselement aan te roepen, zoekt het XAML-framework op of het besturingselement het patroon Aanroepen implementeert en, indien dat het geval is, activeert het (het is niet nodig om te luisteren naar de gebeurtenis KeyboardAcceleratorInvoked).
In het volgende voorbeeld activeert Control+S de Klikgebeurtenis omdat de knop het aanroeppatroon implementeert.
<Button Content="Save" Click="OnSave">
<Button.KeyboardAccelerators>
<KeyboardAccelerator Key="S" Modifiers="Control" />
</Button.KeyboardAccelerators>
</Button>
Als een element meerdere besturingspatronen implementeert, kan er slechts één worden geactiveerd via een accelerator. De controlepatronen krijgen als volgt prioriteit:
- Aanroepen (knop)
- Wisselknop (selectievakje)
- Selectie (ListView)
- Uitvouwen/Inklappen (keuzelijst)
Als er geen overeenkomst wordt geïdentificeerd, is de accelerator ongeldig en wordt er een foutopsporingsbericht weergegeven ("Geen automatiseringspatronen voor dit component gevonden. Implementeer alle gewenste functionaliteit in de aangeroepen gebeurtenis. Door Handled in uw gebeurtenishandler in te stellen op true, wordt dit bericht onderdrukt.")
Gedrag van aangepaste toetsenbordversneller
De aangeroepen gebeurtenis van het KeyboardAccelerator-object wordt geactiveerd wanneer de accelerator wordt uitgevoerd. Het gebeurtenisobject KeyboardAcceleratorInvokedEventArgs bevat de volgende eigenschappen:
- Afgehandeld (Booleaanse waarde): Als u dit instelt op waar, voorkomt u dat de gebeurtenis het bedieningspatroon activeert en stopt u het bubbling van acceleratorgebeurtenissen. De standaardwaarde is onwaar.
- Element (DependencyObject): het object dat is gekoppeld aan de accelerator.
- KeyboardAccelerator: de toetsenbordversneller die wordt gebruikt om de aangeroepen gebeurtenis te verhogen.
Hier laten we zien hoe u een verzameling toetsenbordversnellers definieert voor items in een ListView en hoe u de aangeroepen gebeurtenis voor elke accelerator kunt afhandelen.
<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;
}
Standaardgedrag van toetsenbord negeren
Sommige bedieningselementen, wanneer ze focus hebben, bieden ondersteuning voor ingebouwde toetsenbordversnellers die een door de app gedefinieerde accelerator overschrijven. Wanneer een tekstvak bijvoorbeeld de focus heeft, kopieert de Control+C-accelerator alleen de geselecteerde tekst (door de app gedefinieerde accelerators worden genegeerd en wordt er geen andere functionaliteit uitgevoerd).
Hoewel het niet raadzaam is om het standaardgedrag van besturingselementen te overschrijven vanwege vertrouwdheid en verwachtingen van de gebruiker, kunt u de ingebouwde toetsenbordversneller van een besturingselement overschrijven. In het volgende voorbeeld ziet u hoe u de Control+C-toetsenbordversneller voor een tekstvak overschrijft via de PreviewKeyDown-gebeurtenis-handler :
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;
}
}
Een toetsenbordversneller uitschakelen
Als een besturingselement is uitgeschakeld, wordt de bijbehorende accelerator ook uitgeschakeld. In het volgende voorbeeld, omdat de eigenschap IsEnabled van de ListView is ingesteld op false, kan de bijbehorende Control+A-accelerator niet worden aangeroepen.
<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>
Ouder- en kindbesturingselementen kunnen dezelfde accelerator delen. In dit geval kan het bovenliggende besturingselement worden aangeroepen, zelfs als het kind de focus heeft en de bijbehorende accelerator is uitgeschakeld.
Schermlezers en toetsenbordversnellers
Schermlezers zoals Verteller kunnen de toetsencombinatie voor sneltoetsen van het toetsenbord aankondigen aan gebruikers. Standaard is dit elke modifier (in de enumvolgorde virtualModifiers) gevolgd door de sleutel (en gescheiden door "+" tekens). U kunt dit aanpassen via de gekoppelde eigenschap AcceleratorKey AutomationProperties. Als er meer dan één accelerator is opgegeven, wordt alleen de eerste aangekondigd.
In dit voorbeeld retourneert AutomationProperty.AcceleratorKey de tekenreeks 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>
Opmerking
Het instellen van AutomationProperties.AcceleratorKey schakelt geen toetsenbordfunctionaliteit in, maar geeft alleen aan aan het UIA-framework welke sleutels worden gebruikt.
Algemene toetsenbordversnellers
U wordt aangeraden toetsenbordversnellers consistent te maken in Windows-toepassingen.
Gebruikers moeten toetsenbordversnellers onthouden en dezelfde (of vergelijkbare) resultaten verwachten, maar dit is mogelijk niet altijd mogelijk vanwege verschillen in functionaliteit in verschillende apps.
| Bewerken | Algemene toetsenbordversneller |
|---|---|
| Bewerkingsmodus starten | Ctrl + E |
| Alle items in een gericht besturingselement of venster selecteren | Ctrl+A |
| Zoeken en vervangen | Ctrl+H |
| Ongedaan | Ctrl+Z |
| Opnieuw | Ctrl+Y |
| Selectie verwijderen en naar het klembord kopiëren | Ctrl+X |
| Selectie naar het klembord kopiëren | Ctrl+C, Ctrl+Insert |
| De inhoud van het klembord plakken | Ctrl +V, Shift + Insert |
| De inhoud van het Klembord plakken (met opties) | Ctrl + Alt + V |
| De naam van een item wijzigen | F2 |
| Een nieuw item toevoegen | Ctrl+N |
| Een nieuw secundair item toevoegen | Ctrl+Shift+N |
| Geselecteerd item verwijderen (met ongedaan maken) | Del, Ctrl+D |
| Geselecteerd item verwijderen (zonder ongedaan te maken) | Shift + Del |
| Vetgedrukt | Ctrl+B |
| Onderstrepen | Ctrl+U |
| Cursief | Ctrl+I |
| Navigatie | |
| Inhoud zoeken in een specifiek controle of venster | Ctrl+F |
| Naar het volgende zoekresultaat gaan | F3 |
| Ga naar het volgende UI-deelvenster. | F6 |
| Ga naar het vorige UI-paneel | Shift + F6 |
| Andere acties | |
| Favorieten toevoegen | Ctrl+D |
| Opfrissen | F5 of Ctrl +R |
| Inzoomen | Ctrl + + |
| Uitzoomen | Ctrl+- |
| In- en uitzoomen op standaardweergave | Ctrl+0 |
| Save | Ctrl+S |
| Close | Ctrl+W |
| Afdrukken | Ctrl+P |
U ziet dat sommige combinaties niet geldig zijn voor gelokaliseerde versies van Windows. In de Spaanse versie van Windows wordt Bijvoorbeeld Ctrl+N gebruikt voor vet in plaats van Ctrl+B. We raden u aan gelokaliseerde toetsenbordversnellers op te geven als de app is gelokaliseerd.
Gebruikersvriendelijkheid mogelijkheden voor sneltoetsen
Tooltips
Omdat toetsenbordversnellers doorgaans niet rechtstreeks in de gebruikersinterface van uw Windows-toepassing worden beschreven, kunt u de detectie verbeteren via knopinfo, die automatisch worden weergegeven wanneer de gebruiker de focus verplaatst, drukt en vasthoudt of de muisaanwijzer boven een besturingselement beweegt. De tooltips kunnen bepalen of een besturingselement een bijbehorende sneltoets heeft en, zo ja, wat de sneltoetscombinatie is.
Windows 10, versie 1803 (update van april 2018) en hoger
Wanneer toetsenbordversnellers worden gedeclareerd, worden standaard alle besturingselementen (behalve MenuFlyoutItem en ToggleMenuFlyoutItem) weergegeven met de bijbehorende toetsencombinaties in knopinfo.
Opmerking
Als een besturingselement meer dan één accelerator heeft gedefinieerd, wordt alleen de eerste weergegeven.
Sneltoetscombinatie in knopinfo
Voor de objecten Button, AppBarButton en AppBarToggleButton wordt de keyboard accelerator toegevoegd aan de standaard-tooltip van het besturingselement. Voor de objecten MenuFlyoutItem en ToggleMenuFlyoutItem wordt de toetsenbordversneller weergegeven met de flyouttekst.
Opmerking
Als u een tooltip opgeeft (zie Knop1 in het volgende voorbeeld) wordt deze functionaliteit overschreven.
<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>
Sneltoetscombinatie toegevoegd aan de standaardtooltips van de knop
<AppBarButton Icon="Save" Label="Save">
<AppBarButton.KeyboardAccelerators>
<KeyboardAccelerator Key="S" Modifiers="Control"/>
</AppBarButton.KeyboardAccelerators>
</AppBarButton>
Combinatie van sneltoets toegevoegd aan de standaardknopinfo van 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>
Combinatie van sneltoets toegevoegd aan de tekst van MenuFlyoutItem
Beheer het gedrag van de presentatie met behulp van de eigenschap KeyboardAcceleratorPlacementMode , die twee waarden accepteert: Auto of Verborgen.
<Button Content="Save" Click="OnSave" KeyboardAcceleratorPlacementMode="Auto">
<Button.KeyboardAccelerators>
<KeyboardAccelerator Key="S" Modifiers="Control" />
</Button.KeyboardAccelerators>
</Button>
In sommige gevallen moet u mogelijk een tooltip presenteren ten opzichte van een ander element (meestal een containerobject).
Hier laten we zien hoe u de eigenschap KeyboardAcceleratorPlacementTarget gebruikt om de sneltoetscombinatie voor een Opslaan-knop weer te geven, gebruikmakend van de Grid-container in plaats van de knop.
<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 sommige gevallen raden we u aan het label van een besturingselement te gebruiken om te bepalen of het besturingselement een bijbehorende toetsenbordversneller heeft en, als dat het geval is, wat de toetsencombinatie van de accelerator is.
Sommige platformbesturingselementen doen dit standaard, met name de objecten MenuFlyoutItem en ToggleMenuFlyoutItem , terwijl de AppBarButton en de AppBarToggleButton dit doen wanneer ze worden weergegeven in het overloopmenu van de CommandBar.
Toetsenbordversnellers die worden beschreven in een menu-itemlabel
U kunt de standaardversnellertekst voor het label overschrijven via de eigenschap KeyboardAcceleratorTextOverride van de eigenschap MenuFlyoutItem, ToggleMenuFlyoutItem, AppBarButton en AppBarToggleButton (gebruik één spatie voor geen tekst).
Opmerking
De overschrijvingstekst wordt niet weergegeven als het systeem geen gekoppeld toetsenbord kan detecteren (u kunt dit zelf controleren via KeyboardPresent).
Geavanceerde concepten
Hier bekijken we enkele aspecten van toetsenbordversnellers op laag niveau.
Prioriteit van invoer gebeurtenis
Invoerevenementen vinden plaats in een specifieke volgorde die u kunt onderscheppen en afhandelen op basis van de vereisten van uw app.
De KeyDown/KeyUp-gebeurtenis die omhoog bubbelt
In XAML wordt een toetsaanslag verwerkt alsof er slechts één invoerbubblingpijplijn is. Deze invoerpijplijn wordt gebruikt door de KeyDown-/KeyUp-gebeurtenissen en tekeninvoer. Als een element bijvoorbeeld de focus heeft en de gebruiker een toets indrukt, wordt een KeyDown-gebeurtenis gegenereerd op het element, gevolgd door het bovenliggende element, enzovoort omhoog de boom in, totdat de eigenschap args.Handled waar is.
De KeyDown-gebeurtenis wordt ook door sommige besturingselementen gebruikt om de ingebouwde besturingsversnellers te implementeren. Wanneer een besturingselement een toetsenbordversneller heeft, wordt de KeyDown-gebeurtenis verwerkt, wat betekent dat er geen doorvoering van de KeyDown-gebeurtenis plaatsvindt. De RichEditBox ondersteunt bijvoorbeeld kopiëren met Ctrl+C. Wanneer Ctrl wordt ingedrukt, wordt de KeyDown-gebeurtenis geactiveerd en doorgegeven. Echter, wanneer de gebruiker tegelijkertijd op C drukt, wordt de KeyDown-gebeurtenis aangeduid als Handled en wordt deze niet uitgevoerd (tenzij de parameter handledEventsToo van UIElement.AddHandler is ingesteld op true).
De CharacterReceived-gebeurtenis
Omdat de CharacterReceived-gebeurtenis wordt geactiveerd na de KeyDown-gebeurtenis voor tekstbesturingselementen zoals Tekstvak, kunt u tekeninvoer annuleren in de KeyDown-gebeurtenis-handler.
De gebeurtenissen PreviewKeyDown en PreviewKeyUp
De preview-invoer gebeurtenissen worden geactiveerd vóór andere gebeurtenissen. Als u deze gebeurtenissen niet verwerkt, wordt de accelerator voor het element met de focus geactiveerd, gevolgd door de KeyDown-gebeurtenis. Beide gebeurtenissen bubbelen totdat ze zijn afgehandeld.
Sleutelgebeurtenissenreeks
Volgorde van gebeurtenissen:
KeyDown-gebeurtenissen bekijken
…
App accelerator
Methode OnKeyDown
KeyDown-gebeurtenis
App-versnellers op het bovenliggend element
OnKeyDown-methode op het bovenliggende object
KeyDown-gebeurtenis op het bovenliggende element
(Bubbels naar de wortel)
…
CharacterReceived-gebeurtenis
PreviewKeyUp-gebeurtenissen
KeyUpEvents
Wanneer de versnellingsgebeurtenis wordt verwerkt, wordt de KeyDown-gebeurtenis ook gemarkeerd als afgehandeld. De KeyUp-gebeurtenis blijft onverwerkt.
Het oplossen van accelerators
Een toetsenbordversnellerevenement bubbelt van het element dat de focus heeft naar de root. Als de gebeurtenis niet wordt verwerkt, zoekt het XAML-framework naar andere niet-gescoopte app-accelerators buiten het bubblingpad.
Wanneer twee toetsenbordversnellers worden gedefinieerd met dezelfde toetsencombinatie, wordt de eerste toetsenbordversneller in de visuele structuur aangeroepen.
Toetsenbordversnellers met een scope worden alleen aangeroepen wanneer de focus zich binnen een specifieke scope bevindt. In een raster met tientallen besturingselementen kan bijvoorbeeld alleen een toetsenbordversneller worden aangeroepen voor een besturingselement wanneer de focus zich binnen het raster bevindt (de eigenaar van het bereik).
Het scope van versnellers programmatig definiëren
De methode UIElement.TryInvokeKeyboardAccelerator roept eventuele overeenkomende accelerators aan in de substructuur van het element.
De methode UIElement.OnProcessKeyboardAccelerators wordt uitgevoerd vóór de toetsenbordversneller. Deze methode geeft een ProcessKeyboardAcceleratorArgs-object door dat de sleutel, de modifier en een Booleaanse waarde bevat die aangeeft of de toetsenbordversneller wordt verwerkt. Als het is gemarkeerd als verwerkt, bubbelt de toetsenbordversneller, zodat de buitenste toetsenbordversneller nooit wordt aangeroepen.
Opmerking
OnProcessKeyboardAccelerators wordt altijd geactiveerd, ongeacht of deze al dan niet wordt verwerkt (vergelijkbaar met de OnKeyDown-gebeurtenis). U moet controleren of de gebeurtenis is gemarkeerd als afgehandeld.
In dit voorbeeld gebruiken we OnProcessKeyboardAccelerators en TryInvokeKeyboardAccelerator om toetsenbordversnellers te bepalen voor het paginaobject:
protected override void OnProcessKeyboardAccelerators(
ProcessKeyboardAcceleratorArgs args)
{
if(args.Handled != true)
{
this.TryInvokeKeyboardAccelerator(args);
args.Handled = true;
}
}
Lokaliseer de accelerators
We raden u aan alle toetsenbordversnellers te lokaliseren. U kunt dit doen met het standaardresourcebestand (.resw) en het kenmerk x:Uid in uw XAML-declaraties. In dit voorbeeld worden de resources automatisch geladen in Windows Runtime.
Toetsenbordversnellerlokalisatie met het resourcesbestand
<Button x:Uid="myButton" Click="OnSave">
<Button.KeyboardAccelerators>
<KeyboardAccelerator x:Uid="myKeyAccelerator" Modifiers="Control"/>
</Button.KeyboardAccelerators>
</Button>
Opmerking
Toetsenbordversnellers worden geïmplementeerd als virtuele toetsen. Gelokaliseerde accelerators moeten worden gekozen uit de vooraf gedefinieerde verzameling Virtual-Key codes (anders treedt er een XAML-parserfout op).
Een accelerator programmatisch instellen
Hier volgt een voorbeeld van het programmatisch definiëren van een accelerator:
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);
}
Opmerking
KeyboardAccelerator is niet deelbaar, dezelfde KeyboardAccelerator kan niet worden toegevoegd aan meerdere elementen.
Gedrag van toetsenbordversneller negeren
U kunt het KeyboardAccelerator.Invoked-evenement afhandelen om het standaardgedrag van de KeyboardAccelerator te overschrijven.
In dit voorbeeld ziet u hoe u de opdracht Alles selecteren (Ctrl+A-toetsenbordversneller) overschrijft in een aangepast ListView-besturingselement. We stellen ook de eigenschap Handled in op True om de gebeurtenis verder te stoppen.
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;
}
}
…
}
Verwante artikelen
Samples
Windows developer