Fokus - ÜbersichtFocus Overview

In WPFWPF gibt es zwei Hauptkonzepte, die den Fokus betreffen: Tastaturfokus und logischer Fokus.In WPFWPF there are two main concepts that pertain to focus: keyboard focus and logical focus. Tastaturfokus bezieht sich auf das Element, das Tastatureingaben empfängt, und der logische Fokus bezieht sich auf das Element in einem Fokusbereich, der Fokus besitzt.Keyboard focus refers to the element that receives keyboard input and logical focus refers to the element in a focus scope that has focus. Diese Konzepte werden in dieser Übersicht ausführlich erläutert.These concepts are discussed in detail in this overview. Für das Erstellen von komplexen Anwendungen, die über mehrere Bereiche verfügen, in denen Fokus abgerufen werden kann, ist es wichtig den Unterschied der Konzepte zu verstehen.Understanding the difference in these concepts is important for creating complex applications that have multiple regions where focus can be obtained.

Die wichtigsten Klassen, die an der Fokus Verwaltung beteiligt sind, sind die Keyboard -Klasse, die FocusManager -Klasse und die-Basiselement Klassen, z UIElement . b ContentElement . und.The major classes that participate in focus management are the Keyboard class, the FocusManager class, and the base element classes, such as UIElement and ContentElement. Weitere Informationen zu den Basiselementen finden Sie unter Übersicht über Basiselemente.For more information about the base elements, see the Base Elements Overview.

Die Keyboard Klasse befasst sich hauptsächlich mit dem Tastaturfokus FocusManager , und die ist in erster Linie mit dem logischen Fokus beschäftigt, aber dies ist kein absoluter Unterschied.The Keyboard class is concerned primarily with keyboard focus and the FocusManager is concerned primarily with logical focus, but this is not an absolute distinction. Ein Element, das über den Tastaturfokus verfügt, besitzt auch einen logischen Fokus, aber ein Element mit dem logischen Fokus muss nicht unbedingt über den Tastaturfokus verfügen.An element that has keyboard focus will also have logical focus, but an element that has logical focus does not necessarily have keyboard focus. Dies ist offensichtlich, wenn Sie die-Klasse verwenden, Keyboard um das Element mit dem Tastaturfokus festzulegen, damit auch der logische Fokus auf dem Element festgelegt wird.This is apparent when you use the Keyboard class to set the element that has keyboard focus, for it also sets logical focus on the element.

TastaturfokusKeyboard Focus

Der Tastaturfokus bezieht sich auf das Element, das derzeit Tastatureingaben empfängt.Keyboard focus refers to the element that is currently receiving keyboard input. Es kann nur ein Element auf dem gesamten Desktop geben, das über den Tastaturfokus verfügt.There can be only one element on the whole desktop that has keyboard focus. In WPFWPF wird das Element, das über den Tastaturfokus verfügt, IsKeyboardFocused auf festgelegt true .In WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. Die statische-Eigenschaft der- FocusedElement Keyboard Klasse ruft das Element ab, das derzeit über den Tastaturfokus verfügt.The static property FocusedElement on the Keyboard class gets the element that currently has keyboard focus.

Damit ein Element den Tastaturfokus erhalten kann, müssen die Focusable -Eigenschaft und die-Eigenschaft der IsVisible Basiselemente auf festgelegt werden true .In order for an element to obtain keyboard focus, the Focusable and the IsVisible properties on the base elements must be set to true. Einige Klassen, z Panel . b. die Basisklasse, haben Focusable standardmäßig auf festgelegt false . Daher müssen Sie auf festlegen, Focusable true Wenn ein solches Element den Tastaturfokus abrufen soll.Some classes, such as the Panel base class, have Focusable set to false by default; therefore, you must set Focusable to true if you want such an element to be able to obtain keyboard focus.

Tastaturfokus kann durch die Benutzerinteraktion mit BenutzeroberflächeUI abgerufen werden, z.B. durch das Wechseln mit der Tabulatortaste zu einem Element oder durch Klicken mit der Maus auf bestimmte Elemente.Keyboard focus can be obtained through user interaction with the BenutzeroberflächeUI, such as tabbing to an element or clicking the mouse on certain elements. Der Tastaturfokus kann auch Programm gesteuert mithilfe der- Focus Methode für die- Keyboard Klasse abgerufen werden.Keyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Die- Focus Methode versucht, dem angegebenen Element den Tastaturfokus zu übergeben.The Focus method attempts to give the specified element keyboard focus. Das zurückgegebene Element ist das Element mit Tastaturfokus, was möglicherweise ein anderes Element als angefordert sein kann, wenn das alte oder neue Fokusobjekt die Anforderung blockiert.The returned element is the element that has keyboard focus, which might be a different element than requested if either the old or new focus object block the request.

Im folgenden Beispiel wird die- Focus Methode verwendet, um den Tastaturfokus auf einen festzulegen Button .The following example uses the Focus method to set keyboard focus on a Button.

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

Die- IsKeyboardFocused Eigenschaft in den Basiselement Klassen Ruft einen Wert ab, der angibt, ob das Element über den Tastaturfokus verfügt.The IsKeyboardFocused property on the base element classes gets a value indicating whether the element has keyboard focus. Die- IsKeyboardFocusWithin Eigenschaft in den Basiselement Klassen Ruft einen Wert ab, der angibt, ob das Element oder eines seiner visuellen untergeordneten Elemente über den Tastaturfokus verfügt.The IsKeyboardFocusWithin property on the base element classes gets a value indicating whether the element or any one of its visual child elements has keyboard focus.

Wenn beim Starten der Anwendung der anfängliche Fokus festgelegt wird, muss sich das Element, das den Fokus erhält, in der visuellen Struktur des ursprünglichen Fensters befinden, das von der Anwendung geladen wird, und das-Element muss über Focusable und IsVisible auf festlegen true .When setting initial focus at application startup, the element to receive focus must be in the visual tree of the initial window loaded by the application, and the element must have Focusable and IsVisible set to true. Die empfohlene Stelle zum Festlegen des ersten Fokus ist der- Loaded Ereignishandler.The recommended place to set initial focus is in the Loaded event handler. Ein Dispatcher Rückruf kann auch durch Aufrufen von oder verwendet werden Invoke BeginInvoke .A Dispatcher callback can also be used by calling Invoke or BeginInvoke.

Logischer FokusLogical Focus

Der logische Fokus bezieht sich auf den FocusManager.FocusedElement in einem Fokusbereich.Logical focus refers to the FocusManager.FocusedElement in a focus scope. Ein Fokusbereich ist ein Element, das den FocusedElement innerhalb seines Bereichs verfolgt.A focus scope is an element that keeps track of the FocusedElement within its scope. Wenn der Tastaturfokus einen Fokusbereich verlässt, wird das Element den Tastaturfokus verlieren, jedoch behält es den logischen Fokus.When keyboard focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. Wenn der Tastaturfokus zum Fokusbereich zurückkehrt, wird das Fokuselement Tastaturfokus erhalten.When keyboard focus returns to the focus scope, the focused element will obtain keyboard focus. Somit kann der Tastaturfokus zwischen mehreren Fokusbereichen geändert werden, aber es wird sichergestellt, dass das Fokuselement im Fokusbereich erneut Tastaturfokus erhält, wenn der Fokus wieder zum Fokusbereich zurückkehrt.This allows for keyboard focus to be changed between multiple focus scopes but ensures that the focused element in the focus scope regains keyboard focus when focus returns to the focus scope.

Es können mehrere Elemente vorhanden sein, die über logischen Fokus in einer Anwendung verfügen, jedoch kann es nur ein Element geben, das den logischen Fokus in einem bestimmten Fokusbereich besitzt.There can be multiple elements that have logical focus in an application, but there may only be one element that has logical focus in a particular focus scope.

Ein Element, das den Tastaturfokus besitzt, verfügt über den logischen Fokus innerhalb des Fokusbereichs, dem er angehört.An element that has keyboard focus has logical focus for the focus scope it belongs to.

Ein Element kann in einen Fokusbereich in umgewandelt werden Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) , indem die FocusManager angefügte-Eigenschaft auf festgelegt wird IsFocusScope true .An element can be turned into a focus scope in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) by setting the FocusManager attached property IsFocusScope to true. Im Code kann ein Element in einen Fokusbereich umgewandelt werden, indem aufgerufen wird SetIsFocusScope .In code, an element can be turned into a focus scope by calling SetIsFocusScope.

Im folgenden Beispiel wird ein StackPanel durch Festlegen der angefügten-Eigenschaft in einen Fokusbereich umgewandelt IsFocusScope .The following example makes a StackPanel into a focus scope by setting the IsFocusScope attached property.

<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 Gibt den Fokusbereich für das angegebene Element zurück.GetFocusScope returns the focus scope for the specified element.

Klassen WPFWPF , bei denen es sich standardmäßig um Schwerpunktbereiche handelt, sind Window , MenuItem , ToolBar und ContextMenu .Classes in WPFWPF which are focus scopes by default are Window, MenuItem, ToolBar, and ContextMenu.

GetFocusedElement Ruft das fokussierte Element für den angegebenen Fokusbereich ab.GetFocusedElement gets the focused element for the specified focus scope. SetFocusedElement legt das fokussierte Element im angegebenen Fokusbereich fest.SetFocusedElement sets the focused element in the specified focus scope. SetFocusedElement wird normalerweise verwendet, um das anfängliche Fokus Element festzulegen.SetFocusedElement is typically used to set the initial focused element.

Das folgende Beispiel legt das Fokuselement auf einen Fokusbereich fest und ruft das Fokuselement eines Fokusbereichs ab.The following example sets the focused element on a focus scope and gets the focused element of a focus scope.

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

TastaturnavigationKeyboard Navigation

Die- KeyboardNavigation Klasse ist für die Implementierung der Standardtastatur Fokus Navigation verantwortlich, wenn eine der Navigationstasten gedrückt wird.The KeyboardNavigation class is responsible for implementing default keyboard focus navigation when one of the navigation keys is pressed. Die Navigationstasten sind: TAB, UMSCHALT+TAB, STRG+TAB, STRG+UMSCHALT+TAB, PFEIL-NACH-OBEN, PFEIL-NACH-UNTEN, PFEIL-NACH LINKS und PFEIL-NACH-RECHTS.The navigation keys are: TAB, SHIFT+TAB, CTRL+TAB, CTRL+SHIFT+TAB, UPARROW, DOWNARROW, LEFTARROW, and RIGHTARROW keys.

Das Navigationsverhalten eines Navigations Containers kann geändert werden, indem die angefügten KeyboardNavigation Eigenschaften TabNavigation , und festgelegt werden ControlTabNavigation DirectionalNavigation .The navigation behavior of a navigation container can be changed by setting the attached KeyboardNavigation properties TabNavigation, ControlTabNavigation, and DirectionalNavigation. Diese Eigenschaften sind vom Typ KeyboardNavigationMode , und die möglichen Werte lauten Continue ,, Local Contained , Cycle , Once und None .These properties are of type KeyboardNavigationMode and the possible values are Continue, Local, Contained, Cycle, Once, and None. Der Standardwert ist Continue . Dies bedeutet, dass das Element kein Navigations Container ist.The default value is Continue, which means the element is not a navigation container.

Im folgenden Beispiel wird eine Menu mit einer Reihe von- MenuItem Objekten erstellt.The following example creates a Menu with a number of MenuItem objects. Die TabNavigation angefügte-Eigenschaft ist Cycle auf festgelegt Menu .The TabNavigation attached property is set to Cycle on the Menu. Wenn der Fokus mithilfe der Tab-Taste in geändert wird Menu , wird der Fokus von jedem Element verschoben, und wenn das letzte Element erreicht ist, wird der Fokus an das erste Element zurückgegeben.When focus is changed using the tab key within the Menu, focus will move from each element and when the last element is reached focus will return to the first 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)

Weitere APIs, die mit dem Fokus arbeiten, sind MoveFocus und PredictFocus .Additional API to work with focus are MoveFocus and PredictFocus.

MoveFocus ändert den Fokus auf das nächste Element in der Anwendung.MoveFocus changes focus to the next element in the application. Eine TraversalRequest wird verwendet, um die Richtung anzugeben.A TraversalRequest is used to specify the direction. Der FocusNavigationDirection an weiter gegebene MoveFocus gibt an, dass die verschiedenen Richtungen verschoben werden können, z First . b., Last Up und Down .The FocusNavigationDirection passed to MoveFocus specifies the different directions focus can be moved, such as First, Last, Up and Down.

Im folgenden Beispiel wird verwendet MoveFocus , um das fokussierte Element zu ändern.The following example uses MoveFocus to change the focused element.

// 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 Gibt das-Objekt zurück, das den Fokus erhält, wenn der Fokus geändert werden sollte.PredictFocus returns the object which would receive focus if focus were to be changed. Derzeit werden nur Up , Down , Left und Right von unterstützt PredictFocus .Currently, only Up, Down, Left, and Right are supported by PredictFocus.

FokusereignisseFocus Events

Die Ereignisse im Zusammenhang mit dem Tastaturfokus sind PreviewGotKeyboardFocus , GotKeyboardFocus und PreviewLostKeyboardFocus LostKeyboardFocus .The events related to keyboard focus are PreviewGotKeyboardFocus, GotKeyboardFocus and PreviewLostKeyboardFocus, LostKeyboardFocus. Die Ereignisse werden als angefügte Ereignisse in der- Keyboard Klasse definiert, sind aber leichter als äquivalente Routing Ereignisse in den Basiselement Klassen zugänglich.The events are defined as attached events on the Keyboard class, but are more readily accessible as equivalent routed events on the base element classes. Weitere Informationen zu Ereignissen finden Sie unter Übersicht über Routingereignisse.For more information about events, see the Routed Events Overview.

GotKeyboardFocus wird ausgelöst, wenn das Element den Tastaturfokus erhält.GotKeyboardFocus is raised when the element obtains keyboard focus. LostKeyboardFocus wird ausgelöst, wenn das Element den Tastaturfokus verliert.LostKeyboardFocus is raised when the element loses keyboard focus. Wenn das PreviewGotKeyboardFocus -Ereignis oder das PreviewLostKeyboardFocusEvent -Ereignis behandelt wird und Handled auf festgelegt ist true , wird der Fokus nicht geändert.If the PreviewGotKeyboardFocus event or the PreviewLostKeyboardFocusEvent event is handled and Handled is set to true, then focus will not change.

Im folgenden Beispiel werden die GotKeyboardFocus -und- LostKeyboardFocus Ereignishandler an einen angefügt TextBox .The following example attaches GotKeyboardFocus and LostKeyboardFocus event handlers to a 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>

Wenn das den TextBox Tastaturfokus erhält, Background wird die-Eigenschaft von TextBox in geändert LightBlue .When the TextBox obtains keyboard focus, the Background property of the TextBox is changed to 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

Wenn das den TextBox Tastaturfokus verliert, Background wird die-Eigenschaft des-Objekts TextBox wieder in weiß geändert.When the TextBox loses keyboard focus, the Background property of the TextBox is changed back to white.

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

Die Ereignisse im Zusammenhang mit dem logischen Fokus sind GotFocus und LostFocus .The events related to logical focus are GotFocus and LostFocus. Diese Ereignisse werden für die FocusManager als angefügte Ereignisse definiert, aber FocusManager nicht die CLR-Ereigniswrapper.These events are defined on the FocusManager as attached events, but the FocusManager does not expose CLR event wrappers. UIElement und machen ContentElement diese Ereignisse bequemer verfügbar.UIElement and ContentElement expose these events more conveniently.

Weitere InformationenSee also