2009-10-29 10 views
11

Estoy tratando de atrapar eventos del mouse en WPF utilizando una ventana no modal superior y transparente. Me parece que esto funciona bien si la opacidad de la ventana es 0.01 o mayor y tiene un color de fondo, pero cuando la opacidad se establece en 0, ya no recibe mensajes del mouse. ¿Hay alguna manera de hacer que esta ventana se vea completamente transparente y aún así obtener la entrada del mouse?Crear una ventana WPF completamente transparente para capturar eventos del mouse

+0

Las ventanas transparentes pueden causar problemas en general, soy un poco curioso por qué se fue con este enfoque. Entiendo que 3.5 SP1 resolvió algunos de los principales problemas, pero aún así es una forma bastante pesada de atrapar la entrada del mouse. Si ya puede tomar la pantalla, ¿sería mejor hacerlo dentro de la ventana de la aplicación? – Egor

Respuesta

28

Por lo que sé, no.

Cuando un Control o Window es completamente transparente, se puede hacer clic a través de él. Este es el caso si configura su Window.Background="Transparent" o Opacity="0". Hasta donde yo sé, esto es por diseño en WPF.

Al usar una opacidad de 0.01, apenas debería ver la ventana, si es que lo hace. Esta es probablemente su mejor apuesta para lograr la funcionalidad.

Editar: Otra solución, que probé y funciona, es establecer el color de fondo a un color casi transparente. Usé Background="#01000000", dando así un valor alfa de 1. Esto hace que el fondo de la ventana tenga un aspecto transparente, pero le permite colocar controles con la ventana a plena opacidad.

+0

Sí, tampoco pude encontrar una solución alternativa. Que tiene sentido. –

+0

Ver mi edición para una solución diferente. Puede cambiar el fondo a un color casi transparente y aún así mantener la ventana con la opacidad completa en caso de que quiera superponer algunos controles en la pantalla. –

+0

La segunda solución funciona, pero tiene el mismo aspecto que configurar la Opacidad en 0.01. –

3

Simplemente configure Background = Brushes.Transparent en lugar de Background = null.

No necesita usar opacidad (es decir, simplemente déjelo al 100% de opacidad).

+4

Probé esto, pensando en la misma posibilidad, pero no funciona. Cuando el Fondo es transparente, el programa no captura los clics, sino que se apropia del programa que se encuentre debajo. –

+0

¿Puedes mostrar un ejemplo? Uso este enfoque (generalmente # 00000000 porque es muy fácil de escribir) y parece funcionar bien para mí. – Egor

0

Al establecer la opacidad en 100% (o en cualquier valor distinto de cero), y el fondo en Transparente (en lugar de nulo), la mayoría de los controles se pueden hacer visibles.

Asegúrese de establecer IsHitTestVisible en verdadero. No todos los controles pueden ser afectados, incluso si la opacidad es del 100% y el fondo es transparente.

+0

Tal vez estoy haciendo algo mal, pero cuando hago un Show en una ventana con estos ajustes no aparece en absoluto (es decir, la ventana no está presente cuando alt + tab). –

12

En Visual Studio 2010: Seleccione su ventana en la vista de diseño.

Establecer las propiedades de la ventana para:

  • AllowsTransparency: comprobar que
  • Antecedentes: Transparente
  • WindowStyle: Ninguno
+2

No estoy seguro de por qué esto no obtuvo ningún +1, ¡funciona perfectamente! – JMK

+1

@JMK Porque esto hace que los clics pasen a través de la ventana, a menos que aciertes un control real dentro de la ventana. – prettyvoid

+0

La clave para mí fue "Permitir la transparencia" – ariel

1

Por ejemplo creo que su nombre de control es MyGrid y usted quiere que sea Transparent y siempre obtenga MouseOverEvent .....

Si (ventana AllowsTransparency es Truey la ventana Background es Transparent) Entonces

uso un color como #01777777 para MyGridBackgroundO0.01 para MyGridOpacity.

Else

uso algo así como #00777777 para MyGridBackgroundO0.00 para MyGridOpacity.

0

Puede que le resulte más sencillo usar Mouse.Capture.

https://msdn.microsoft.com/en-us/library/ms771301.aspx

Cuando un objeto captura el ratón, todos los eventos relacionados con el ratón son tratados como si el objeto con la captura del mouse realizar el evento, incluso si el puntero del ratón se encuentra sobre otro objeto.

Cuestiones relacionadas