2009-04-23 12 views
8

Ho un UserControl personalizzato che tenta di ricreare il completamento automatico per una casella di testo. Quando l'utente digita, il testo viene utilizzato per filtrare una raccolta di elementi fornita e quindi un Popup visualizza un ListBox con elementi che corrispondono a ciò che l'utente ha digitato.Nascondere il controllo Popup quando un'altra finestra è a fuoco

Sfortunatamente, se l'utente decide di passare dall'applicazione a un'altra finestra (browser, MS Word, qualsiasi cosa!), Il Popup rimane sopra ogni altra finestra!

Inoltre, se si sposta la finestra (che ospita il controllo personalizzato) con il popup aperto, il popup rimane in posizione (e non segue la finestra)! È piuttosto divertente, ma ovviamente non è accettabile. Ho guardato in giro, ma ho trovato solo un post su questo che è andato senza risposta per due anni :(

+0

A partire da febbraio 2010, il WPF Autocompletebox ha questo problema ... :( –

risposta

13

In realtà, non mi ero reso conto che avevo la proprietà StaysOpen del Popup impostato su true.

<Popup StaysOpen="False" /> 

in realtà fa il trucco per me.

0

Secondo il Popup documentation:

Quando Popup viene visualizzato sullo schermo, ma non di riposizionarsi se genitore viene riposizionato.

Quindi non sembra che sarebbe un buon candidato per una casella di testo di completamento automatico. credo che la classe è pensato più per mostrare informazioni quando si passa sopra un elemento.

+1

ComboBox utilizza Popup e rimane in posizione mentre il ComboBox si sposta .. quindi deve essere possibile – Schneider

4

Ho avuto lo stesso problema in uno scenario simile. Quello che ho fatto è stato sottoscrivere tutti gli eventi "a fuoco perso" possibili del controllo e anche avere la finestra che ospita il controllo e iscritta ai suoi eventi GotMouseCapture e LocationChanged. I gestori di eventi di tutti quegli eventi impostano la proprietà IsOpen del popup su false.

è possibile ottenere la finestra di hosting con questo:

parentWindow = Window.GetWindow(this); 

ogni altro codice è semplicemente un sacco di sottoscrizione di eventi per fare la stessa cosa.

P.S. Non sto dicendo che sia una soluzione carina o ottimale, ma per me va bene :)

Problemi correlati