2013-03-19 9 views
6

Possiedo un controllo utente con diversi elementi figlio, tra cui caselle di controllo e caselle di testo.Impedisci l'interruzione di LostFocus quando gli elementi figli perdono la messa a fuoco

Vorrei attivare l'evento LostFocus per il mio controllo utente solo quando l'attenzione viene persa sull'intero controllo utente (ad esempio facendo clic su un pulsante al di fuori del controllo utente).

Attualmente, l'evento LostFocus si attiva anche quando mi sposto tra elementi figlio del mio controllo utente, ad es. da una casella di testo a un'altra.

risposta

-1
protected override void OnLostFocus(EventArgs args) 
{ 
     if (!ContainsFocus) 
     { 
      // Only do something here 
     } 
} 

Il trucco è quello di verificare la presenza di ContainsFocus

nel costruttore probabilmente sarà necessario aggiungere il codice simile al seguente per catturare l'attenzione dei vostri perso controlli figlio (come non sarà possibile ottenere la notifica diretta quando perdono messa a fuoco per qualche altra parte) chiamando

CaptureLostFocus(this); 

e l'attuazione:

void CaptureLostFocus(Control control) 
{ 
     foreach(Control child in control.Controls) 
     { 
      child.LostFocus += (s, e) => OnLostFocus(e); 
      CaptureLostFocus(control); 
     } 
} 
+4

Da quello che riesco a vedere, non c'è ContainsFocus in WPF da verificare con – binncheol

+0

. Non penso che ci sia una proprietà Controls su un controllo. – Ben

+1

Come non è stato downvoted questo? Sembra che stia parlando di winforms, non di wpf. – person27