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

时间:2011-01-27 16:18:54

标签: wpf transparency opacity

有没有办法让WPF窗口透明而不会丢失非客户区域(边框,标题栏,关闭/最小化/最大化按钮)?

将'AllowTransparency'设置为'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内容。

有什么想法吗?

Transparent Notepad2 Window

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

代替将合成属性设置为

ACCENT_ENABLE_ACRYLICBLURBEHIND

设置为

ACCENT_INVALID_STATE

这将使客户区完全透明。

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