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 窗口透明度(包括非客户区)的主要内容,如果未能解决你的问题,请参考以下文章