WPF 窗口透明度(包括非客户区)

Posted

技术标签:

【中文标题】WPF 窗口透明度(包括非客户区)【英文标题】:WPF Window Transparency (including Non-Client Area) 【发布时间】:2011-06-16 16:11:26 【问题描述】:

有什么方法可以使 WPF 窗口透明而不丢失非客户区(边框、标题栏、关闭/最小化/最大化按钮)?

将“AllowsTransparency”设置为“true”需要将“WindowStyle”设置为“None”(如this answer 中所述),这会删​​除非客户区。

一位 WPF 开发人员 blogged about how transparent windows work in WPF,以及为什么难以实现对非客户区透明度的支持。

无论您的窗口样式可能暗示什么,透明的 WPF 窗口都没有任何可见的非客户区。这适用于许多旨在创建自定义窗口形状的场景,但对于只想“淡入”普通窗口的人来说可能会很烦人。

那么,仅 WPF 的解决方案似乎是不可能的。

调用本机 SetLayeredWindowAttributes function 并传递 WPF 窗口的句柄和 LWA_ALPHA 没有效果,正如预期的那样。

我能想到的唯一其他方法是在 Win32(或可能是 WinForms)窗口中托管 WPF 内容。但是,我怀疑尝试这样做会导致airspace issues。

WPF 分层窗口在不同的操作系统上具有不同的功能... WPF 不支持透明度颜色键,因为 WPF 不能保证渲染您请求的确切颜色,尤其是在渲染是硬件加速时。

我不确定我是否正确阅读了上述内容,但听起来好像无法托管具有透明度的 WPF 内容。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以使用名为 WPF Chrome 的 ms 库自定义非客户区。查看这篇文章:'Custom Window Chrome'。

使用此库,您可以使 chrome 透明并更改更多内容。

【讨论】:

我不认为这个库提供任何机制来使标准窗口镶边透明。我想避免对非客户区负责,并将其留给 DWM。【参考方案2】:

Fluidkit 有一个玻璃窗的实现,我认为这就是你所追求的。

【讨论】:

谢谢。 FluidKit GlassWindow 实现看起来相当不错,并且可以让我在删除/替换非客户区时设置窗口不透明度。但是,我正在寻找一种无需绘制自己的非客户区的解决方案。【参考方案3】:

实现此目的的唯一方法是使用setWindowCompositionAttribute() 方法并将其设置为无效状态。

看看这段代码:https://github.com/riverar/sample-win32-acrylicblur

而不是将组合属性设置为

ACCENT_ENABLE_ACRYLICBLURBEHIND

设置为

ACCENT_INVALID_STATE

它将使客户区完全透明。

注意:SetWindowCompositionAttribute() 是未记录 API 的一部分。可以随时更改。

【讨论】:

以上是关于WPF 窗口透明度(包括非客户区)的主要内容,如果未能解决你的问题,请参考以下文章

求助,关于Qt的窗口半透明,窗口上的空间不透明

2019-11-27-WPF-全屏透明窗口

2019-11-29-WPF-非客户区的触摸和鼠标点击响应

c ++ mfc非客户区包含其他窗口吗

WPF 全透明 + 不可点击

WPF窗口左上角不透明