如何在WPF中创建一个允许鼠标事件通过的半透明窗口 [英] How to create a semi transparent window in WPF that allows mouse events to pass through
问题描述
我正在尝试创建类似于 Adobe Lightroom 中的 Lights out/lights dim 功能的效果 (http://www.youtube.com/watch?v=87hNd3vaENE),WPF 除外.
I am trying to create an effect similar to the Lights out /lights dim feature in Adobe Lightroom (http://www.youtube.com/watch?v=87hNd3vaENE) except in WPF.
我尝试的是在现有窗口的顶部创建另一个窗口,使其透明并在其上放置一个半透明的路径几何体.但我希望鼠标事件能够通过这个半透明窗口(到下面的窗口).
What I tried was to create another window over-top of my existing window, make it transparent and put a semi transparent Path geometry on it. But I want mouse events to be able to pass through this semi transparent window (on to windows below).
这是我所拥有的简化版本:
This is a simplified version of what I have:
<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>
窗口是完全透明的,所以在路径没有覆盖的地方,鼠标事件直接通过.到现在为止还挺好.路径对象上的 IsHitTestvisible 设置为 false.因此鼠标事件将通过它传递给同一窗体上的其他控件(即您可以单击按钮,因为它在同一窗体上).
The window is fully transparent, so on places where the Path doesn't cover, mouse events pass right through. So far so good. The IsHitTestvisible is set to false on the path object. So mouse events will pass through it to other controls on the same form (ie you can click on the Button, because it is on the same form).
但是鼠标事件不会通过 Path 对象传递到它下面的窗口.
But mouse events wont pass through the Path object onto windows that are below it.
有什么想法吗?或者更好的方法来解决这个问题?
Any ideas? Or better ways to solve this problem?
谢谢.
推荐答案
我遇到了类似的问题并找到了解决方案:
I've had similar problem and found a solution:
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);
}
}
对于您的窗口集:
WindowStyle = None
Topmost = true
AllowsTransparency = true
在窗口后面的代码中添加:
in code behind for the window add:
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
var hwnd = new WindowInteropHelper(this).Handle;
WindowsServices.SetWindowExTransparent(hwnd);
}
瞧——点击窗口!请参阅以下原始答案:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f
and voila - click-through window! See original answer in: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f
这篇关于如何在WPF中创建一个允许鼠标事件通过的半透明窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!