【问题标题】:WPF Window Transparency (including Non-Client Area)WPF 窗口透明度(包括非客户区)
【发布时间】: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 内容。

有什么想法吗?

【问题讨论】:

    标签: wpf transparency opacity


    【解决方案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 的一部分。可以随时更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      相关资源
      最近更新 更多