ventanas ventana modal abrir wpf transparency

modal - Cómo crear una ventana semitransparente en WPF que permite el paso de los eventos del mouse



modal wpf c# (3)

Intento crear un efecto similar a la función Lights out / lights dim en Adobe Lightroom ( http://www.youtube.com/watch?v=87hNd3vaENE ) excepto en WPF.

Lo que probé fue crear otra ventana sobre mi ventana existente, hacerla transparente y ponerle una geometría de ruta semitransparente. Pero quiero que los eventos del mouse puedan pasar a través de esta ventana semitransparente (en las ventanas a continuación).

Esta es una versión simplificada de lo que tengo:

<Window x:Class="LightsOut.MaskWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" AllowsTransparency="True" WindowStyle="None" ShowInTaskbar="False" Topmost="True" Background="Transparent"> <Grid> <Button HorizontalAlignment="Left" Height="20" Width="60">click</Button> <Path IsHitTestVisible="False" Stroke="Black" Fill="Black" Opacity="0.3"> <Path.Data> <RectangleGeometry Rect="0,0,1000,1000 "/> </Path.Data> </Path> </Grid>

La ventana es completamente transparente, por lo que en los lugares donde no se cubre la ruta, los eventos del mouse pasan directamente. Hasta aquí todo bien. IsHitTestvisible se establece en falso en el objeto de ruta. Por lo tanto, los eventos del mouse pasarán a otros controles en el mismo formulario (es decir, puede hacer clic en el botón, porque está en el mismo formulario).

Pero los eventos del mouse no pasarán por el objeto Path hasta las ventanas que están debajo de él.

¿Algunas ideas? O mejores formas de resolver este problema?

Gracias.


He tenido un problema similar y encontré una solución:

public static class WindowsServices { const int WS_EX_TRANSPARENT = 0x00000020; const int GWL_EXSTYLE = (-20); [DllImport("user32.dll")] static extern int GetWindowLong(IntPtr hwnd, int index); [DllImport("user32.dll")] static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); public static void SetWindowExTransparent(IntPtr hwnd) { var extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT); } }

para su conjunto de ventanas:

WindowStyle = None Topmost = true AllowsTransparency = true

en el código detrás de la ventana agregue:

protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); var hwnd = new WindowInteropHelper(this).Handle; WindowsServices.SetWindowExTransparent(hwnd); }

y voila - ventana de clic! Vea la respuesta original en: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f


Lo que describes parece el comportamiento esperado. Una solución es establecer el relleno en {x: nulo} en la ruta, ya que es la única forma segura de hacer que un objeto no apunte a la prueba.


Tengo otra idea.

¿Qué pasaría si hiciera exactamente UN PIXEL, justo debajo del cursor del mouse, completamente transparente? :]