【问题标题】:Blur behind transparent WPF window透明 WPF 窗口后面的模糊
【发布时间】:2015-10-25 00:18:15
【问题描述】:

我正在尝试创建一个带有半透明无边框窗口的 WPF 应用程序,该窗口会模糊其背后的背景。

这是我想做的一个例子。 Screenshot

我尝试使用仅适用于 Windows Vista/7 的 DwmEnableBlurBehindWindow

我正在尝试寻找适用于 Windows 7、8 和 10 的解决方案。

【问题讨论】:

  • 您确定它不能在 Windows 8 上运行吗? This link 似乎暗示 DWM 在 Windows 8 上总是 on
  • MS 从 win 8 中移除了这个功能
  • 您仍然可以在 Windows 8 中使用 DwmEnableBlurBehindWindow,但是行为与预期不同,它不会在应用程序后面模糊,它只是根据您的 Windows 配色方案使用实心填充
  • 正如我所说,那是因为 MS 删除了该功能。

标签: c# wpf winapi


【解决方案1】:

Windows 8

尽管最好完全忘记死胡同,但我们可能需要确保我们的程序在不同版本中的行为一致。如果不需要动态背景,特别是如果窗口相对较小(主要候选者是消息框或我们自己的应用程序窗口上的类似内容),则捕获窗口后面的屏幕并手动模糊它的解决方案可能会起作用.在Loaded 事件处理程序中:

var screen = window.Owner.PointToScreen(new System.Windows.Point((window.Owner.ActualWidth - window.ActualWidth) / 2, (window.Owner.ActualHeight - window.ActualHeight) / 2));
var rect = new Rectangle((int)screen.X, (int)screen.Y, (int)window.ActualWidth, (int)window.ActualHeight);
var bitmap = new Bitmap(rect.Width, rect.Height);
using (var graphics = Graphics.FromImage(bitmap))
  graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0, rect.Size);
border.Background = new ImageBrush(ApplyGaussianBlur(bitmap.ToBitmapImage())) {
  TileMode = TileMode.None,
  Stretch = Stretch.None,
  AlignmentX = AlignmentX.Center,
  AlignmentY = AlignmentY.Center,
};

其中border 是最外层的Border,通常完全为空,仅在 Windows 8 上使用。

辅助函数就是通常的位图转换:

public static BitmapSource ToBitmapImage(this System.Drawing.Bitmap image) {
  var hBitmap = image.GetHbitmap();
  var bitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
  DeleteObject(hBitmap);
  return bitmap;
}

ApplyGaussianBlur() 最好使用像WriteableBitmapEx 这样的直接位图操作包来解决,并带有必要的modifications.

【讨论】:

    【解决方案2】:

    我希望我不会迟到。您可以使用 SetWindowCompositionAttribute,但随后您必须将 WindowStyle 设置为“None”并实现您自己的本机 Window 功能和句柄。从自定义控件继承也相当复杂。然而,长话短说。有 BlurryControls。

    您可以通过 NuGet 浏览“BlurryControls”或在 GitHub 上自行查看代码来找到它。不管怎样,我希望这会有所帮助。

    您还可以在 GitHub 上找到一个示例应用程序。

    【讨论】:

      【解决方案3】:

      对于任何感兴趣的人,我已经找到了适用于 Windows 10 的解决方案,它看起来好像在 Windows 8 上是不可能的,就像 David Heffernan 提到的那样,DwmEnableBlurBehindWindow 已从 Windows 8 中删除,但是微软重新引入了一个解决方案来实现这一点Windows 10 中的效果。

      【讨论】:

      【解决方案4】:

      Microsoft 从 Windows 8 开始删除了玻璃效果。这就解释了为什么在 Windows 8 及更高版本上未观察到您所期望的模糊效果。你必须学会​​在那些操作系统上没有它。

      【讨论】:

      • 我知道windows 8已经去掉了玻璃效果,肯定还是有办法实现这个效果的,我见过其他的程序,比如Start10
      • @Tom:This 看起来不像真正的 Aero 玻璃效果。从外观上看,应用程序似乎截取了背景截图并将其叠加到自己的背景纹理上。
      • @IInspectable:我一开始也是这么想的,但是我在它后面播放了一个视频,你可以看到它在移动,我尝试了你提到的方法,通过截屏并将其添加到背景中应用模糊效果,它确实有效,但它并不理想。如果在窗口打开时桌面发生变化,那么这种错觉就会被破坏。
      • @Tom:我刚刚安装了 Windows 10,你是对的:高斯模糊又回来了几个 UI 元素(开始菜单、时钟/日历、操作中心等)。
      猜你喜欢
      • 2019-07-15
      • 2017-12-28
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2018-11-14
      相关资源
      最近更新 更多