2009-04-30 11 views
8

Qualcuno può dirmi come navigare a livello di programmazione attraverso tutte le interruzioni di tabulazione degli elementi dell'interfaccia utente in un'applicazione WPF? Voglio iniziare con il primo tab stop annusare l'elemento corrispondente, visitare il prossimo tab stop, annusare l'elemento corrispondente e così via fino a raggiungere l'ultimo punto di tabulazione.Come spostarsi in modo programmato tra gli elementi di tabulazione degli elementi dell'interfaccia utente WPF?

Grazie, - Mike

risposta

27

Fate che l'utilizzo MoveFocus come mostrato in questo articolo di MSDN che spiega tutto di messa a fuoco: Focus Overview.

Ecco un esempio di codice per passare al prossimo elemento focalizzato (ottenuto da quell'articolo, leggermente modificato).

// MoveFocus takes a TraversalRequest as its argument. 
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next); 

// Gets the element with keyboard focus. 
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement; 

// Change keyboard focus. 
if (elementWithFocus != null) 
{ 
    elementWithFocus.MoveFocus(request); 
} 
+0

geniale, grazie mille! – lamarmora

1

È possibile farlo con la chiamata MoveFocus. È possibile ottenere l'oggetto attualmente focalizzato attraverso il FocusManager. Il seguente codice eseguirà l'iterazione di tutti gli oggetti nella finestra e li aggiungerà a un elenco. Si noti che questo modificherà fisicamente la finestra passando alla messa a fuoco. Molto probabilmente il codice non funzionerà se la finestra non è attiva.

// Select the first element in the window 
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); 

TraversalRequest next = new TraversalRequest(FocusNavigationDirection.Next); 
List<IInputElement> elements = new List<IInputElement>(); 

// Get the current element. 
UIElement currentElement = FocusManager.GetFocusedElement(this) as UIElement; 
while (currentElement != null) 
{ 
    elements.Add(currentElement); 

    // Get the next element. 
    currentElement.MoveFocus(next); 
    currentElement = FocusManager.GetFocusedElement(this) as UIElement; 

    // If we looped (If that is possible), exit. 
    if (elements[0] == currentElement) 
     break; 
} 
+0

Il codice precedente non ha funzionato sulla mia finestra WPF. L'elenco finisce per essere vuoto. La prima chiamata GetFocusedElement() sopra restituisce null. Sono d'accordo che questo codice corrisponda esattamente alla documentazione, ma sfortunatamente non ha funzionato per me. Sto scavando per capire perché. –

+1

Dove chiami il codice? Nota che la finestra deve essere attiva in modo che il costruttore sia definitivamente fuori. OnLoad potrebbe funzionare, ho usato Activated che viene chiamato ogni volta che attivi la finestra. –

Problemi correlati