WPF 全透明 + 不可点击
Posted
技术标签:
【中文标题】WPF 全透明 + 不可点击【英文标题】:WPF full transparent + non clickable 【发布时间】:2014-08-08 16:43:24 【问题描述】:好的,我的 WPF 应用程序有问题。到目前为止,我设法制作了一个具有透明背景的窗口(+ 无刷)。如果我的窗口聚焦,我还添加了功能。所以很明显我的窗口不应该被聚焦(因为透明度)。这是可行的,但是当我添加让我们说矩形(在画布上)时:
Rectangle testRectangleForText = new Rectangle();
testRectangleForText.Stroke = Brushes.Black;
testRectangleForText.StrokeThickness = 5;
testRectangleForText.Fill = null;
testRectangleForText.Height = 300;
testRectangleForText.Width = 300;
Canvas.SetLeft(testRectangleForText, 0);
Canvas.SetTop(testRectangleForText, 20);
myCanvas.Children.Add(testRectangleForText);
矩形是可点击的,如果我点击它,我的应用程序将获得焦点(applicationFocus 函数显示 messageBox),我不希望这样。我已经找到了 Win 表单的解决方案,但不是 WPF,这就是我在这里问这个的原因。 win表格的解决方案在这里:WINFORM SOLUTION
好的,现在举个例子,我想要实现的目标: example image
所以红色区域是我的窗口(WPF APP)大小。背景是透明的(显然)。后台应用程序是记事本。我们可以在 Canvas 上看到文本和矩形。 现在,如果我单击 1.(first) 箭头,这是顺便说一句透明区域,什么也没有发生(这很好)。如果我点击 2.(second) 箭头,会出现 MessageBox,这意味着我的 WPF APP 已获得焦点,这就是我不想要的。
【问题讨论】:
尝试将矩形的Fill
属性设置为x:Null
,即为空画笔。空画笔与透明画笔不同,不会对鼠标点击做出反应。
什么是 testRectangleForText.Fill = null; ?无论如何,矩形仍然是可点击的(因为“中风”),中风是黑色的。它必须是,所以我可以看到矩形:)。
【参考方案1】:
这对我有用:
从这里:https://social.msdn.microsoft.com/Forums/vstudio/en-US/41ca3605-247c-4c5b-ac5d-74ce5abd7b92/making-a-window-invisible-to-mouse-events-ishittestvisiblefalse-not-working?forum=wpf
我已经想出了如何做到这一点。关键是窗口扩展样式的 WS_EX_TRANSPARENT 标志。您可以像往常一样设置最顶层的属性,然后此代码负责使窗口对鼠标单击透明:
代码片段
public const int WS_EX_TRANSPARENT = 0x00000020;
public const int GWL_EXSTYLE = (-20);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hwnd, int index);
[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
protected override void OnSourceInitialized(EventArgs e)
base.OnSourceInitialized(e);
// Get this window's handle
IntPtr hwnd = new WindowInteropHelper(this).Handle;
// Change the extended window style to include WS_EX_TRANSPARENT
int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
【讨论】:
【参考方案2】:尝试在您的 XAML 代码中设置 Focusable
属性:
<Window ... Focusable="False">
< ... />
</Window>
【讨论】:
对我不起作用.. 好吧,我猜问题出在其他地方。我在 this.Dispatcher.Invoke((Action)(() => .... )) 中添加原语从另一个线程。但我没有看到线程和 Canvas(或原语)属性之间的联系。提前 Ty。以上是关于WPF 全透明 + 不可点击的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个不规则形状的图像按钮,其中图像的透明部分不可点击?