Cenni preliminari sullo stato attivoFocus Overview

In WPFWPF lo stato attivo è basato su due concetti principali, lo stato attivo della tastiera e lo stato attivo logico.In WPFWPF there are two main concepts that pertain to focus: keyboard focus and logical focus. Lo stato attivo della tastiera fa riferimento all'elemento che riceve l'input della tastiera, mentre lo stato attivo logico fa riferimento all'elemento di un ambito che ha ricevuto lo stato attivo.Keyboard focus refers to the element that receives keyboard input and logical focus refers to the element in a focus scope that has focus. In questa panoramica verranno illustrati in dettaglio questi concetti.These concepts are discussed in detail in this overview. Comprendere le differenze esistenti tra questi concetti è fondamentale per la creazione di applicazioni complesse costituite da più aree in cui è possibile ottenere lo stato attivo.Understanding the difference in these concepts is important for creating complex applications that have multiple regions where focus can be obtained.

Le classi principali che partecipano alla gestione dello stato attivo sono la Keyboard classe, la FocusManager classe e le classi degli elementi di base, ad esempio UIElement e ContentElement .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. Per altre informazioni sugli elementi di base, vedere Cenni preliminari sugli elementi di base.For more information about the base elements, see the Base Elements Overview.

La Keyboard classe è preoccupata principalmente con lo stato attivo della tastiera e l'oggetto FocusManager è principalmente con lo stato attivo logico, ma non si tratta di una distinzione assoluta.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. Un elemento con lo stato attivo della tastiera presenta anche lo stato attivo logico, mentre un elemento che ha ottenuto lo stato attivo logico non ha necessariamente lo stato attivo della tastiera.An element that has keyboard focus will also have logical focus, but an element that has logical focus does not necessarily have keyboard focus. Questa operazione è evidente quando si usa la Keyboard classe per impostare l'elemento con lo stato attivo della tastiera, perché imposta anche lo stato attivo logico sull'elemento.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.

Stato attivo della tastieraKeyboard Focus

Lo stato attivo della tastiera fa riferimento all'elemento che riceve l'input dalla tastiera.Keyboard focus refers to the element that is currently receiving keyboard input. Su un desktop può esserci un solo elemento con lo stato attivo della tastiera.There can be only one element on the whole desktop that has keyboard focus. In WPFWPF l'elemento con lo stato attivo della tastiera sarà IsKeyboardFocused impostato su true .In WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. La proprietà statica della FocusedElement Keyboard classe ottiene l'elemento che dispone attualmente dello stato attivo della tastiera.The static property FocusedElement on the Keyboard class gets the element that currently has keyboard focus.

Affinché un elemento ottenga lo stato attivo della tastiera, le Focusable IsVisible proprietà e sugli elementi di base devono essere impostate su 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. Alcune classi, ad esempio la Panel classe base, sono Focusable impostate su per false impostazione predefinita; pertanto, è necessario impostare Focusable su true se si desidera che tale elemento possa ottenere lo stato attivo della tastiera.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.

Lo stato attivo della tastiera può essere ottenuto tramite interazione dell'utente con l'Interfaccia utenteUI, ad esempio usando il tasto TAB per spostarsi su un elemento o facendo clic con il mouse su alcuni elementi.Keyboard focus can be obtained through user interaction with the Interfaccia utenteUI, such as tabbing to an element or clicking the mouse on certain elements. Lo stato attivo della tastiera può essere ottenuto anche a livello di programmazione tramite il Focus metodo nella Keyboard classe.Keyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Il Focus metodo tenta di assegnare lo stato attivo della tastiera all'elemento specificato.The Focus method attempts to give the specified element keyboard focus. L'elemento restituito è l'elemento con lo stato attivo della tastiera e potrebbe non essere quello richiesto se l'oggetto stato attivo nuovo o quello precedente blocca la richiesta.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.

Nell'esempio seguente viene usato il Focus metodo per impostare lo stato attivo della tastiera su un oggetto 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

La IsKeyboardFocused proprietà sulle classi degli elementi di base ottiene un valore che indica se l'elemento ha lo stato attivo della tastiera.The IsKeyboardFocused property on the base element classes gets a value indicating whether the element has keyboard focus. La IsKeyboardFocusWithin proprietà sulle classi degli elementi di base ottiene un valore che indica se l'elemento o uno dei relativi elementi figlio visivi ha lo stato attivo della tastiera.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.

Quando si imposta lo stato attivo iniziale all'avvio dell'applicazione, l'elemento che riceve lo stato attivo deve trovarsi nella struttura ad albero visuale della finestra iniziale caricata dall'applicazione e l'elemento deve avere Focusable e IsVisible impostare su 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. La posizione consigliata per impostare lo stato attivo iniziale è nel Loaded gestore eventi.The recommended place to set initial focus is in the Loaded event handler. Un Dispatcher callback può essere utilizzato anche chiamando Invoke o BeginInvoke .A Dispatcher callback can also be used by calling Invoke or BeginInvoke.

Stato attivo logicoLogical Focus

Lo stato attivo logico fa riferimento a FocusManager.FocusedElement in un ambito di stato attivo.Logical focus refers to the FocusManager.FocusedElement in a focus scope. Un ambito di stato attivo è un elemento che tiene traccia del FocusedElement all'interno del relativo ambito.A focus scope is an element that keeps track of the FocusedElement within its scope. Quando lo stato attivo della tastiera lascia un ambito di stato attivo, l'elemento con lo stato attivo perde lo stato attivo della tastiera, ma mantiene quello logico.When keyboard focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. Quando lo stato attivo della tastiera torna nell'ambito di stato attivo, l'elemento con lo stato attivo ottiene lo stato attivo della tastiera.When keyboard focus returns to the focus scope, the focused element will obtain keyboard focus. In questo modo, lo stato attivo della tastiera può essere passato tra più ambiti, ma l'elemento con lo stato attivo nell'ambito di stato attivo ottiene sicuramente di nuovo lo stato attivo della tastiera quando lo stato attivo ritorna all'ambito di stato attivo.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.

In un'applicazione possono esserci più elementi con lo stato attivo logico, ma in un determinato ambito di stato attivo può esserci un solo elemento con lo stato attivo logico.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.

Un elemento con stato attivo della tastiera ha lo stato attivo logico per l'ambito a cui appartiene.An element that has keyboard focus has logical focus for the focus scope it belongs to.

Un elemento può essere trasformato in un ambito di stato attivo in impostando Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) la FocusManager proprietà associata IsFocusScope su 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. Nel codice, un elemento può essere trasformato in un ambito di stato attivo chiamando SetIsFocusScope .In code, an element can be turned into a focus scope by calling SetIsFocusScope.

Nell'esempio seguente viene StackPanel trasformato in un ambito di stato attivo impostando la IsFocusScope proprietà associata.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 Restituisce l'ambito dello stato attivo per l'elemento specificato.GetFocusScope returns the focus scope for the specified element.

WPFWPFPer impostazione predefinita, le classi in cui sono gli ambiti di stato attivo sono Window ,, MenuItem ToolBar e ContextMenu .Classes in WPFWPF which are focus scopes by default are Window, MenuItem, ToolBar, and ContextMenu.

GetFocusedElement Ottiene l'elemento con lo stato attivo per l'ambito dello stato attivo specificato.GetFocusedElement gets the focused element for the specified focus scope. SetFocusedElement imposta l'elemento con stato attivo nell'ambito di stato attivo specificato.SetFocusedElement sets the focused element in the specified focus scope. SetFocusedElement viene in genere utilizzato per impostare l'elemento con stato attivo iniziale.SetFocusedElement is typically used to set the initial focused element.

L'esempio seguente illustra come impostare e ottenere l'elemento con lo stato attivo in un ambito di stato attivo.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)

Navigazione tramite tastieraKeyboard Navigation

La KeyboardNavigation classe è responsabile dell'implementazione dello spostamento dello stato attivo della tastiera predefinito quando viene premuto uno dei tasti di navigazione.The KeyboardNavigation class is responsible for implementing default keyboard focus navigation when one of the navigation keys is pressed. ovvero TAB, MAIUSC+TAB, CTRL+TAB, CTRL+MAIUSC+TAB, tasto FRECCIA SU, tasto FRECCIA GIÙ, tasto FRECCIA SINISTRA e tasto FRECCIA DESTRA.The navigation keys are: TAB, SHIFT+TAB, CTRL+TAB, CTRL+SHIFT+TAB, UPARROW, DOWNARROW, LEFTARROW, and RIGHTARROW keys.

Il comportamento di navigazione di un contenitore di navigazione può essere modificato impostando le KeyboardNavigation proprietà associate TabNavigation , ControlTabNavigation e DirectionalNavigation .The navigation behavior of a navigation container can be changed by setting the attached KeyboardNavigation properties TabNavigation, ControlTabNavigation, and DirectionalNavigation. Queste proprietà sono di tipo KeyboardNavigationMode e i valori possibili sono Continue , Local , Contained , Cycle , Once e None .These properties are of type KeyboardNavigationMode and the possible values are Continue, Local, Contained, Cycle, Once, and None. Il valore predefinito è Continue , che indica che l'elemento non è un contenitore di navigazione.The default value is Continue, which means the element is not a navigation container.

Nell'esempio seguente viene creato un oggetto Menu con un numero di MenuItem oggetti.The following example creates a Menu with a number of MenuItem objects. La TabNavigation proprietà associata è impostata Cycle su in Menu .The TabNavigation attached property is set to Cycle on the Menu. Quando lo stato attivo viene modificato utilizzando il tasto TAB all'interno di Menu , lo stato attivo viene spostato da ogni elemento e quando l'ultimo elemento viene raggiunto, lo stato attivo torna al primo elemento.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)

Le API aggiuntive per lavorare con lo stato attivo sono MoveFocus e PredictFocus .Additional API to work with focus are MoveFocus and PredictFocus.

MoveFocus imposta lo stato attivo sull'elemento successivo nell'applicazione.MoveFocus changes focus to the next element in the application. TraversalRequestPer specificare la direzione, viene usato un oggetto.A TraversalRequest is used to specify the direction. Il FocusNavigationDirection passato a MoveFocus specifica che è possibile spostare lo stato attivo in direzioni diverse, ad esempio First , Last Up e Down .The FocusNavigationDirection passed to MoveFocus specifies the different directions focus can be moved, such as First, Last, Up and Down.

Nell'esempio seguente viene usato MoveFocus per modificare l'elemento con lo stato attivo.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 Restituisce l'oggetto che riceve lo stato attivo se lo stato attivo deve essere modificato.PredictFocus returns the object which would receive focus if focus were to be changed. Attualmente, solo Up , Down , Left e Right sono supportati da PredictFocus .Currently, only Up, Down, Left, and Right are supported by PredictFocus.

Eventi di stato attivoFocus Events

Gli eventi correlati allo stato attivo della tastiera sono PreviewGotKeyboardFocus , GotKeyboardFocus e PreviewLostKeyboardFocus LostKeyboardFocus .The events related to keyboard focus are PreviewGotKeyboardFocus, GotKeyboardFocus and PreviewLostKeyboardFocus, LostKeyboardFocus. Gli eventi sono definiti come eventi associati sulla Keyboard classe, ma sono più facilmente accessibili come eventi indirizzati equivalenti nelle classi degli elementi di base.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. Per altre informazioni sugli eventi, vedere Cenni preliminari sugli eventi indirizzati.For more information about events, see the Routed Events Overview.

GotKeyboardFocus viene generato quando l'elemento ottiene lo stato attivo della tastiera.GotKeyboardFocus is raised when the element obtains keyboard focus. LostKeyboardFocus viene generato quando l'elemento perde lo stato attivo della tastiera.LostKeyboardFocus is raised when the element loses keyboard focus. Se l' PreviewGotKeyboardFocus evento o l'evento PreviewLostKeyboardFocusEvent viene gestito e Handled è impostato su true , lo stato attivo non cambierà.If the PreviewGotKeyboardFocus event or the PreviewLostKeyboardFocusEvent event is handled and Handled is set to true, then focus will not change.

Nell'esempio seguente vengono collegati GotKeyboardFocus i LostKeyboardFocus gestori eventi e a un oggetto 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>

Quando TextBox ottiene lo stato attivo della tastiera, la Background proprietà di TextBox viene modificata in 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

Quando TextBox perde lo stato attivo della tastiera, la Background proprietà di TextBox viene modificata di nuovo in bianco.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

Gli eventi correlati allo stato attivo logico sono GotFocus e LostFocus .The events related to logical focus are GotFocus and LostFocus. Questi eventi vengono definiti in FocusManager come eventi associati, ma non FocusManager espone wrapper di eventi CLR.These events are defined on the FocusManager as attached events, but the FocusManager does not expose CLR event wrappers. UIElement ed ContentElement esporre questi eventi più facilmente.UIElement and ContentElement expose these events more conveniently.

Vedi ancheSee also