在无边框WPF窗口上没有玻璃效果的原生航空模糊

我知道已经提出并回答了类似的问题。 然而,我的问题是一个由三部分组成的问题。

出于此问题的目的,请记住以下几点:

  • 我是一名业余,早期大学本科学习计算机科学。 我在复杂的编程方面非常不熟练,但我可以理解大多数术语。
  • 这是使用VB.NET在Visual Studio中创建的WPF项目,但由于语言的相似性,我可以轻松阅读C#。
  • 这是我第一次尝试使用任何DWM API。

1.将Aero Glass应用于无边框窗口

首先,是否可以在无边框窗口的背景中使用玻璃效果? 如果是这样(我相信它),这是怎么做到的?

此外,由于Windows 8及更新版本不再使用半透明玻璃效果,这仍然可以在这些操作系统上完成吗?

2.无玻璃保持原生模糊效果

我想要平滑的原生DWM模糊效果,但我不想要光滑的玻璃覆盖,我不希望在用户的主题设置中预定义窗口颜色。

3.自定义模糊半径和位置

是否可以仅将此效果应用于窗口的某个部分? 更重要的是,是否可以调整模糊效果的强度(半径)?

编辑 – 截图示例

根据要求,我已经发布了一些我希望实现的效果的例子。

现行计划

上面的图片是我的WPF应用程序的实际屏幕截图(仍在开发中)。 它的极简主义设计在很大程度上依赖于动画和窗口大小的动画。

模糊的程序

使用一些photoshop技巧,我已经渲染了上面的图像,展示了我想要创建的效果, 正是我想要的方式。 请注意以下事项:

  • 模糊具有比通常的Aero模糊效果更高的半径(强度)
  • 模糊仅在窗口的一部分上可见
  • 模糊不会从桌面的绿色主题inheritance其颜色

1.将Aero Glass应用于无边框窗口

因为你想要实现的不是玻璃效果,而是更多的透明+模糊,你可以使用以下方法模糊窗口后面。

Windows 7 :您可以使用DwmEnableBlurBehindWindow在窗口后面模糊。

窗口8 :因为在Windows 8中删除了DwmEnableBlurBehindWindow,所以我找不到可行的解决方案。

Windows 10 :您可以使用SetWindowCompositionAttribute在窗口后面模糊。

2.无玻璃保持原生模糊效果

以上解决方案仅在窗口后面应用模糊效果,它将由窗口定义透明度和颜色。

3.自定义模糊半径和位置

使用这些方法,您只能在整个窗口下方模糊,并且您可以在要透明的窗口部分上使用Alpha通道。 我认为你也不能定义模糊半径。

我的借口

请原谅我对Stackoverflow的经验不足,但我想我会尽力帮你解决一下。

通过关注Tom发布的链接,我能够遇到这段代码(最初是在c#中)。 所以看来这个代码对于大多数人来说并不容易获得,这里是:

Imports System.Runtime.InteropServices Imports System.Windows.Interop 'Import namespace ("name of project" . "name of namespace") Imports Blurred_Opacity.BlurBehind Namespace BlurTest Enum AccentState ACCENT_DISABLED = 0 ACCENT_ENABLE_GRADIENT = 1 ACCENT_ENABLE_TRANSPARENTGRADIENT = 2 ACCENT_ENABLE_BLURBEHIND = 3 ACCENT_INVALID_STATE = 4 End Enum Structure AccentPolicy Public AccentState As AccentState Public AccentFlags As Integer Public GradientColor As Integer Public AnimationId As Integer End Structure Structure WindowCompositionAttributeData Public Attribute As WindowCompositionAttribute Public Data As IntPtr Public SizeOfData As Integer End Structure Enum WindowCompositionAttribute WCA_ACCENT_POLICY = 19 End Enum End Namespace Class MainWindow  Friend Shared Function SetWindowCompositionAttribute(hwnd As IntPtr, ByRef data As WindowCompositionAttributeData) As Integer End Function Sub Window_Loaded() handles me.loaded EnableBlur() End Sub Sub Window_MouseDown() handles me.MouseLeftButtonDown DragMove() End Sub Sub EnableBlur() Dim windowHelper = New WindowInteropHelper(Me) Dim accent = New AccentPolicy() accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND Dim accentStructSize = Marshal.SizeOf(accent) Dim accentPtr = Marshal.AllocHGlobal(accentStructSize) Marshal.StructureToPtr(accent, accentPtr, False) Dim Data = New WindowCompositionAttributeData() Data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY Data.SizeOfData = accentStructSize Data.Data = accentPtr SetWindowCompositionAttribute(windowHelper.Handle, Data) Marshal.FreeHGlobal(accentPtr) End Sub End Class 

结果

一旦实现,这将影响整个Window,如下所示:

整个窗口模糊

稍微调整一下

在尝试复制你的设计约5分钟后,我想出了这个:

最终窗口

XAML

我相信你能比我的设计做得更好。 只需调整背景颜色(在窗口上)即可更改混合颜色,也可以更改不透明度级别。 我的设计的XAML如下:

                                       

我希望这有帮助!