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.
In WPF zijn er twee hoofdconcepten die betrekking hebben op focus: toetsenbordfocus en logische focus. De toetsenbordfocus verwijst naar het element dat toetsenbordinvoer ontvangt en logische focus verwijst naar het element in een focusbereik met focus. Deze concepten worden in dit overzicht uitgebreid besproken. Inzicht in het verschil in deze concepten is belangrijk voor het maken van complexe toepassingen met meerdere regio's waar de focus kan worden verkregen.
De belangrijkste klassen die deelnemen aan focusbeheer zijn de Keyboard klasse, de FocusManager-klasse en de basiselementklassen, zoals UIElement en ContentElement. Zie het Overzicht van basiselementen voor meer informatie over de basiselementen.
De Keyboard klasse heeft voornamelijk betrekking op toetsenbordfocus en de FocusManager heeft voornamelijk betrekking op logische focus, maar dit is geen absoluut onderscheid. Een element met toetsenbordfocus heeft ook een logische focus, maar een element met logische focus heeft niet noodzakelijkerwijs de toetsenbordfocus. Dit is duidelijk wanneer u de Keyboard-klasse gebruikt om het element met toetsenbordfocus in te stellen, zodat het ook de logische focus op het element instelt.
Toetsenbordfocus
De focus van het toetsenbord verwijst naar het element dat momenteel toetsenbordinvoer ontvangt. Er kan slechts één element op het hele bureaublad zijn met toetsenbordfocus. In WPF wordt het element dat toetsenbordfocus heeft IsKeyboardFocused ingesteld op true. De statische eigenschap FocusedElement op de Keyboard-klasse krijgt het element dat momenteel de toetsenbordfocus heeft.
Als u wilt dat een element de toetsenbordfocus krijgt, moeten de Focusable en de IsVisible eigenschappen op de basiselementen worden ingesteld op true. Voor sommige klassen, zoals de Panel basisklasse, is Focusable standaard ingesteld op false; Daarom moet u Focusable instellen op true als u wilt dat een dergelijk element de toetsenbordfocus kan krijgen.
De toetsenbordfocus kan worden verkregen via gebruikersinteractie met de gebruikersinterface, zoals tabs op een element of door met de muis op bepaalde elementen te klikken. Toetsenbordfocus kan ook programmatisch worden verkregen met behulp van de methode Focus op de Keyboard klasse. De methode Focus probeert de opgegeven elementtoetsenbordfocus te geven. Het geretourneerde element is het element dat de toetsenbordfocus heeft, wat mogelijk een ander element is dan aangevraagd als het oude of nieuwe focusobject de aanvraag blokkeert.
In het volgende voorbeeld wordt de methode Focus gebruikt om de toetsenbordfocus op een Buttonin te stellen.
private void OnLoaded(object sender, RoutedEventArgs e)
{
// Sets keyboard focus on the first Button in the sample.
Keyboard.Focus(firstButton);
}
Private Sub OnLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Sets keyboard focus on the first Button in the sample.
Keyboard.Focus(firstButton)
End Sub
De eigenschap IsKeyboardFocused op de basiselementklassen krijgt een waarde die aangeeft of het element de toetsenbordfocus heeft. De eigenschap IsKeyboardFocusWithin op de basis-elementklassen krijgt een waarde die aangeeft of het element of een van zijn visuele kindelementen de toetsenbordfocus heeft.
Bij het instellen van de eerste focus bij het opstarten van de toepassing, moet het element dat de focus moet krijgen, zich in de visuele structuur van het eerste venster bevinden dat door de toepassing wordt geladen. Het element moet Focusable en IsVisible zijn ingesteld op true. De aanbevolen plaats om de eerste focus in te stellen, bevindt zich in de Loaded gebeurtenis-handler. Een Dispatcher callback kan ook worden gebruikt door Invoke of BeginInvokeaan te roepen.
Logische focus
Logische focus verwijst naar de FocusManager.FocusedElement in een focusbereik. Een focusbereik is een element dat de FocusedElement binnen zijn scope bijhoudt. Wanneer de toetsenbordfocus een focusbereik verlaat, zal het focuselement de toetsenbordfocus verliezen maar de logische focus behouden. Wanneer de focus van het toetsenbord teruggaat naar het focusbereik, krijgt het focuselement de toetsenbordfocus. Hierdoor kan de toetsenbordfocus worden gewijzigd tussen meerdere focusbereiken, maar zorgt u ervoor dat het focuselement in het focusbereik weer de focus van het toetsenbord krijgt wanneer de focus terugkomt naar het focusbereik.
Er kunnen meerdere elementen zijn die logische focus hebben in een toepassing, maar er kan maar één element zijn dat logische focus heeft in een bepaald focusbereik.
Een element met toetsenbordfocus heeft logische focus voor het focusbereik waartoe het behoort.
Een element kan worden omgezet in een focusbereik in Extensible Application Markup Language (XAML) door de FocusManager gekoppelde eigenschap in te stellen IsFocusScope op true. In code kan een element worden omgezet in een focusbereik door SetIsFocusScopeaan te roepen.
In het volgende voorbeeld wordt een StackPanel een focusbereik door het instellen van de gekoppelde eigenschap IsFocusScope.
<StackPanel Name="focusScope1"
FocusManager.IsFocusScope="True"
Height="200" Width="200">
<Button Name="button1" Height="50" Width="50"/>
<Button Name="button2" Height="50" Width="50"/>
</StackPanel>
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);
Dim focuseScope2 As New StackPanel()
FocusManager.SetIsFocusScope(focuseScope2, True)
GetFocusScope retourneert het focusbereik voor het opgegeven element.
Klassen in WPF die standaard focusbereiken zijn, zijn Window, MenuItem, ToolBaren ContextMenu.
GetFocusedElement krijgt het focuselement voor het opgegeven focusbereik. SetFocusedElement stelt het focuselement in het opgegeven focusbereik in. SetFocusedElement wordt doorgaans gebruikt om het eerste gerichte element in te stellen.
In het volgende voorbeeld wordt het focuselement ingesteld op een focusbereik en wordt het focuselement van een focusbereik opgehaald.
// Sets the focused element in focusScope1
// focusScope1 is a StackPanel.
FocusManager.SetFocusedElement(focusScope1, button2);
// Gets the focused element for focusScope 1
IInputElement focusedElement = FocusManager.GetFocusedElement(focusScope1);
' Sets the focused element in focusScope1
' focusScope1 is a StackPanel.
FocusManager.SetFocusedElement(focusScope1, button2)
' Gets the focused element for focusScope 1
Dim focusedElement As IInputElement = FocusManager.GetFocusedElement(focusScope1)
Toetsenbordnavigatie
De KeyboardNavigation klasse is verantwoordelijk voor het implementeren van standaardtoetsenbordfocusnavigatie wanneer een van de navigatietoetsen wordt ingedrukt. De navigatietoetsen zijn: Tab, Shift+Tab, Ctrl+Tab, Ctrl+Shift+Tab, UPARROW, DOWNARROW, LEFTARROW en RIGHTARROW-toetsen.
Het navigatiegedrag van een navigatiecontainer kan worden gewijzigd door de gekoppelde KeyboardNavigation eigenschappen in te stellen TabNavigation, ControlTabNavigationen DirectionalNavigation. Deze eigenschappen zijn van het type KeyboardNavigationMode en de mogelijke waarden zijn Continue, Local, Contained, Cycle, Onceen None. De standaardwaarde is Continue, wat betekent dat het element geen navigatiecontainer is.
In het volgende voorbeeld wordt een Menu gemaakt met een aantal MenuItem objecten. De gekoppelde eigenschap TabNavigation is ingesteld op Cycle op de Menu. Wanneer de focus in de Menuwordt gewijzigd met behulp van de tabtoets, verschuift de focus van elk element en gaat bij het bereiken van het laatste element weer terug naar het eerste element.
<Menu KeyboardNavigation.TabNavigation="Cycle">
<MenuItem Header="Menu Item 1" />
<MenuItem Header="Menu Item 2" />
<MenuItem Header="Menu Item 3" />
<MenuItem Header="Menu Item 4" />
</Menu>
Menu navigationMenu = new Menu();
MenuItem item1 = new MenuItem();
MenuItem item2 = new MenuItem();
MenuItem item3 = new MenuItem();
MenuItem item4 = new MenuItem();
navigationMenu.Items.Add(item1);
navigationMenu.Items.Add(item2);
navigationMenu.Items.Add(item3);
navigationMenu.Items.Add(item4);
KeyboardNavigation.SetTabNavigation(navigationMenu,
KeyboardNavigationMode.Cycle);
Dim navigationMenu As New Menu()
Dim item1 As New MenuItem()
Dim item2 As New MenuItem()
Dim item3 As New MenuItem()
Dim item4 As New MenuItem()
navigationMenu.Items.Add(item1)
navigationMenu.Items.Add(item2)
navigationMenu.Items.Add(item3)
navigationMenu.Items.Add(item4)
KeyboardNavigation.SetTabNavigation(navigationMenu, KeyboardNavigationMode.Cycle)
Programmatisch navigeren in focus
Extra API voor het werken met focus zijn MoveFocus en PredictFocus.
MoveFocus verplaatst de focus naar het volgende element in de toepassing. Een TraversalRequest wordt gebruikt om de richting op te geven. De FocusNavigationDirection, doorgegeven aan MoveFocus, specificeert de verschillende richtingen waarin de focus kan worden verplaatst, zoals First, Last, Up en Down.
In het volgende voorbeeld wordt MoveFocus gebruikt om het focuselement te wijzigen.
// Creating a FocusNavigationDirection object and setting it to a
// local field that contains the direction selected.
FocusNavigationDirection focusDirection = _focusMoveValue;
// MoveFocus takes a TraveralReqest as its argument.
TraversalRequest request = new TraversalRequest(focusDirection);
// Gets the element with keyboard focus.
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
// Change keyboard focus.
if (elementWithFocus != null)
{
elementWithFocus.MoveFocus(request);
}
' Creating a FocusNavigationDirection object and setting it to a
' local field that contains the direction selected.
Dim focusDirection As FocusNavigationDirection = _focusMoveValue
' MoveFocus takes a TraveralReqest as its argument.
Dim request As New TraversalRequest(focusDirection)
' Gets the element with keyboard focus.
Dim elementWithFocus As UIElement = TryCast(Keyboard.FocusedElement, UIElement)
' Change keyboard focus.
If elementWithFocus IsNot Nothing Then
elementWithFocus.MoveFocus(request)
End If
PredictFocus retourneert het object dat de focus zou krijgen als de focus zou worden gewijzigd. Op dit moment worden alleen Up, Down, Leften Right ondersteund door PredictFocus.
Focusevenementen
De gebeurtenissen met betrekking tot toetsenbordfocus zijn PreviewGotKeyboardFocus, GotKeyboardFocus en PreviewLostKeyboardFocus, LostKeyboardFocus. De gebeurtenissen worden gedefinieerd als gekoppelde gebeurtenissen op de Keyboard-klasse, maar zijn gemakkelijker toegankelijk als gelijkwaardige gerouteerde gebeurtenissen in de basiselementklassen. Zie het Overzicht van gerouteerde gebeurtenissenvoor meer informatie over gebeurtenissen.
GotKeyboardFocus wordt gegenereerd wanneer het element de toetsenbordfocus krijgt.
LostKeyboardFocus wordt gegenereerd wanneer het element de toetsenbordfocus verliest. Als de PreviewGotKeyboardFocus of de PreviewLostKeyboardFocusEvent gebeurtenis wordt verwerkt en Handled is ingesteld op true, verandert de focus niet.
In het volgende voorbeeld worden de event handlers GotKeyboardFocus en LostKeyboardFocus gekoppeld aan een TextBox.
<Border BorderBrush="Black" BorderThickness="1"
Width="200" Height="100" Margin="5">
<StackPanel>
<Label HorizontalAlignment="Center" Content="Type Text In This TextBox" />
<TextBox Width="175"
Height="50"
Margin="5"
TextWrapping="Wrap"
HorizontalAlignment="Center"
VerticalScrollBarVisibility="Auto"
GotKeyboardFocus="TextBoxGotKeyboardFocus"
LostKeyboardFocus="TextBoxLostKeyboardFocus"
KeyDown="SourceTextKeyDown"/>
</StackPanel>
</Border>
Wanneer de TextBox de toetsenbordfocus krijgt, wordt de eigenschap Background van de TextBox gewijzigd in LightBlue.
private void TextBoxGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
TextBox source = e.Source as TextBox;
if (source != null)
{
// Change the TextBox color when it obtains focus.
source.Background = Brushes.LightBlue;
// Clear the TextBox.
source.Clear();
}
}
Private Sub TextBoxGotKeyboardFocus(ByVal sender As Object, ByVal e As KeyboardFocusChangedEventArgs)
Dim source As TextBox = TryCast(e.Source, TextBox)
If source IsNot Nothing Then
' Change the TextBox color when it obtains focus.
source.Background = Brushes.LightBlue
' Clear the TextBox.
source.Clear()
End If
End Sub
Wanneer de TextBox de toetsenbordfocus verliest, wordt de eigenschap Background van de TextBox weer in wit gewijzigd.
private void TextBoxLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
TextBox source = e.Source as TextBox;
if (source != null)
{
// Change the TextBox color when it loses focus.
source.Background = Brushes.White;
// Set the hit counter back to zero and updates the display.
this.ResetCounter();
}
}
Private Sub TextBoxLostKeyboardFocus(ByVal sender As Object, ByVal e As KeyboardFocusChangedEventArgs)
Dim source As TextBox = TryCast(e.Source, TextBox)
If source IsNot Nothing Then
' Change the TextBox color when it loses focus.
source.Background = Brushes.White
' Set the hit counter back to zero and updates the display.
Me.ResetCounter()
End If
End Sub
De gebeurtenissen met betrekking tot logische focus zijn GotFocus en LostFocus. Deze gebeurtenissen worden op de FocusManager gedefinieerd als gekoppelde gebeurtenissen, maar de FocusManager stelt geen CLR-omslagetiketten voor gebeurtenissen beschikbaar. UIElement en ContentElement maken deze gebeurtenissen gemakkelijker toegankelijk.
Zie ook
.NET Desktop feedback