Come creare una finestra semi trasparente in WPF che consenta il passaggio degli eventi del mouse

Sto cercando di creare un effetto simile alla funzione Luci spente / luci deboli in Adobe Lightroom ( http://www.youtube.com/watch?v=87hNd3vaENE ) tranne che in WPF.

Quello che ho provato è stato quello di creare un’altra finestra sopra la mia finestra esistente, renderla trasparente e mettere su di essa una geometria Path semitrasparente. Ma voglio che gli eventi del mouse siano in grado di passare attraverso questa finestra semitrasparente (fino alle windows sottostanti).

Questa è una versione semplificata di ciò che ho:

         

La finestra è completamente trasparente, quindi nei luoghi in cui il percorso non è coperto, gli eventi del mouse passano attraverso. Fin qui tutto bene. IsHitTestvisible è impostato su false sull’object path. Quindi gli eventi del mouse passeranno attraverso di esso ad altri controlli sullo stesso modulo (cioè puoi fare clic sul pulsante, perché è sullo stesso modulo).

Ma gli eventi del mouse non passano attraverso l’object Path su Windows che sono sotto di esso.

Qualche idea? O modi migliori per risolvere questo problema?

Grazie.

Ho avuto un problema simile e ho trovato una soluzione:

 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); } } 

per il tuo set di windows:

 WindowStyle = None Topmost = true AllowsTransparency = true 

nel codice dietro per la finestra aggiungi:

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

e voila – finestra click-through! Vedere la risposta originale in: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

Quello che hai descritto sembra il comportamento atteso. Una soluzione è impostare Fill su {x: Null} sul Path poiché questo è l’unico modo sicuro per fare in modo che un object non colpisca il test.

Ho un’altra idea.

Cosa succede se hai fatto esattamente UNO PIXEL, proprio sotto il cursore del mouse, completamente trasparente? :]