2013-08-09 18 views
10

Qual è la differenza (s) tra GotFocus e GotKeyboardFocus e analogamente LostFocus e LostKeyboardFocus?La differenza tra GotFocus e GotKeyboardFocus

Ci scusiamo per la semplice domanda, ma ho cercato su Google e letto molti post del blog, ma sono ancora confuso. Sembra che nessuno sa esattamente qual è la differenza):

UPDATE:

mio utilizzo:

sto creando un controllo personalizzato estendendo Control classe. Qualcosa come ComboBox ma con alcuni altri effetti. Sto cercando di aprire e chiudere un Popup impostando una proprietà: IsDropDownOpen proprio come un ComboBox attraverso gli eventi GotFocus e LostFocus. Non voglio Popup chiudersi, quando I Alt+Tab ed i windows, ma si chiudono quando clicco su un Button per esempio o vado a un TextBox. Ho fatto:

private static void OnGotFocusHandler(object sender, RoutedEventArgs e) { 
    if (e.Handled) 
     return; 
    ((SearchBox)sender).IsDropDownOpen = true; 
    e.Handled = true; 
} 

private static void OnLostFocusHandler(object sender, RoutedEventArgs e) { 
    if (e.Handled) 
     return; 
    ((SearchBox)sender).IsDropDownOpen = false; 
    e.Handled = true; 
} 

I GotFocus opere. Ma lo Lost non lo ha fatto. Se faccio il roba Lost in LostKeyboardFocus allora quando I Alt+Tab le finestre, o Window diventa inattivo, allora il metodo viene chiamato, mentre io non voglio. Come posso risolverlo?

risposta

12

MSDN ha una panoramica di messa a fuoco, ma proverò a spiegarlo qui.

WPF ha 2 concetti relativi alla messa a fuoco. C'è il focus della tastiera fisica e c'è un focus logico. Solo un elemento può avere il focus della tastiera (e se l'applicazione non è l'applicazione attiva, nessun elemento avrà il focus della tastiera).

Più elementi possono avere la messa a fuoco logica. In effetti, puoi creare nuovi "ambiti di messa a fuoco". Come da MSDN:

Quando il focus della tastiera lascia un ambito di messa a fuoco, l'elemento focalizzato perderà focus della tastiera, ma manterrà attivo logico. Quando la messa a fuoco della tastiera ritorna allo scope di messa a fuoco, l'elemento focalizzato otterrà il focus della tastiera. Ciò consente di cambiare il focus della tastiera tra più aree di messa a fuoco, ma assicura che l'elemento focalizzato nell'area di messa a fuoco riacquisti la messa a fuoco della tastiera quando la messa a fuoco ritorna all'ambito di messa a fuoco.

È possibile definire il proprio ambito attenzione su un elemento (tipicamente un Panel) impostando FocusManager.IsFocusScope="True". I controlli in WPF che sono gli ambiti di messa a fuoco per impostazione predefinita sono Window, MenuItem, ToolBar e ContextMenu.

Questo ha senso se si pensa di avere più Window s nella propria applicazione. Quando ti trovi tra Alt-Tab, ti aspetti che lo stato attivo della tastiera torni nello stesso punto in cui era l'ultima volta che lo stato attivo era Window. Mantenendo separati il ​​fuoco della tastiera e la messa a fuoco logica, puoi ottenere questo risultato.

+1

+1 grazie, buona spiegazione. effettivamente meglio degli MSDN ". Molte grazie. Aspetto altre risposte un po ', e poi -se non meglio quello ricevuto- accetta il tuo. –

+0

Bene, sto cercando di aprire un 'Popup' (in un controllo personalizzato ereditato dalla classe' Control') impostando una proprietà 'IsDropDownOpen'.L'ho impostato su 'true' in' GotFocus', funziona. Voglio impostarlo su 'false', nell'evento' LostFocus'. Ma non funziona. Non voglio farlo in 'LostKeyboardFocus', ma in' LostFocus'. Qualche idea per favore? –

+0

Penso che avrai bisogno di creare una nuova domanda con alcuni esempi di codice. Non riesco a eseguire il debug del tuo scenario da quella breve descrizione. –