2009-04-23 14 views
8

Tengo un UserControl personalizado que intenta recrear el autocompletado para un cuadro de texto. Cuando el usuario escribe, el texto se usa para filtrar una colección de elementos proporcionados y luego aparece una ventana emergente que contiene elementos que coinciden con lo que el usuario ha escrito.Ocultando el control emergente cuando otras ventanas están enfocadas

Desafortunadamente, si el usuario decide cambiarse de la aplicación a otra ventana (navegador, MSWord, ¡cualquier cosa!), ¡La Ventana emergente permanece encima de cada otra ventana!

Además, si muevo mi ventana (que aloja el control personalizado) con la ventana emergente abierta, la ventana emergente permanece en su lugar (y no sigue la ventana). Es un comportamiento algo gracioso pero obviamente no aceptable. He mirado alrededor, pero sólo encontré un puesto de esto que quedó sin respuesta durante dos años :(

+0

A partir de febrero de 2010, el Autocompletebox de WPF tiene este problema ... :( –

Respuesta

13

En realidad, no me di cuenta de que tenía StaysOpen propiedad del Popup establecido en true.

<Popup StaysOpen="False" /> 

me parece el truco.

0

De acuerdo con la Popup documentation:

Cuando se visualiza en la pantalla emergente, no reposicionarse si su los padres se vuelve a colocar.

por lo tanto, no parece que sería un muy buen candidato para un cuadro de texto de autocompletar. Creo que la clase está destinado más para mostrar información cuando se pasa sobre un elemento.

+1

ComboBox utiliza Popup, y eso se mantiene en su posición a medida que se mueve el ComboBox ... por lo que debe ser posible – Schneider

4

Tuve el mismo problema en un escenario similar. Lo que hice fue suscribirme a todos los posibles eventos de "pérdida de foco" del control y también obtuve la ventana que aloja el control y me suscribí a sus eventos GotMouseCapture y LocationChanged. Los controladores de eventos de todos esos eventos están configurando la propiedad IsOpen de la ventana emergente como falsa.

, usted puede obtener la ventana de alojamiento con esto:

parentWindow = Window.GetWindow(this); 

todo otro tipo de código es simplemente una gran cantidad de suscripción de eventos para hacer lo mismo.

P.S. No digo que sea una solución bonita u óptima, pero funciona bien para mí :)

Cuestiones relacionadas