模糊 WPF 容器的背景

Posted

技术标签:

【中文标题】模糊 WPF 容器的背景【英文标题】:Blur the background of the WPF container 【发布时间】:2011-12-10 13:05:26 【问题描述】:

最终,我想要实现的是在某种程度上复制 WPF 内容控件的 Aero 玻璃功能。

如果我将BlurEffect 应用于包含TextBlockStackPanel,我将模糊TextBlock 的文本。

考虑一个例子:

没有模糊

<BlurEffect Radius="5" KernelType="Gaussian"/>

但是有没有一种 WPF 方法可以模糊面板后面的背景,而不是它的内容?

StackPanel 的背景是桌面,托管它的窗口设置为AllowTransparency="True" 以允许自定义形状的外观。

【问题讨论】:

请注意,第二张图片的背景并没有模糊,只是文字。我不确定获得你想要的效果有多容易。这个问题说明了一些关于实现自定义着色器的事情......***.com/questions/1304347/…也许会有所帮助。 还可以查看此 p/Invoke 内容以使用本机 Glass API:dotnet.dzone.com/articles/aero-glass-wpf-window 【参考方案1】:

不,这是不可能的。效果应用于元素及其所有子元素,但您可以轻松地将 TextBlock 放置在容器外,而不是放在容器内。

通常你会使用这样的网格:

<Grid>
  <Border>
     <Border.Effect>
      <BlurEffect Radius="5" KernelType="Gaussian"/>
     </Border.Effect/>
  </Border>
  <TextBlock .../>
</Grid>

在你的例子中,这不会有任何区别。你到底想模糊什么?

【讨论】:

您必须将图像放在模糊的部分。请注意,该图像中的背景并不模糊,即使文本是...【参考方案2】:

StackPanel 的背景是什么?一个图像刷?如果是这样,你为什么不能应用 BlurEffect 呢?

如果这不可能,那么试试这个..

1] 使用图像并将其完全绘制在Grid 上,因为我看到您不想要TileEffect。将BlurEffect 添加到此Image。确保均匀地填充图像。

2] 然后在Grid 中添加具有透明背景的StackPanel 作为下一个子,即不要颠倒图像和堆栈面板的顺序。

3] 然后在 StackPanel 中添加TextBlock

如果您坚持使用Brush 设置为面板的背景,则使用VisualBrush 绘制模糊图像作为堆栈面板的背景,而不是ImageBrush

如果这些提示有帮助,请告诉我。

【讨论】:

他试图模糊 Windows 桌面背景而不是 WPF 中的某些元素。 这就是我想帮助他的事情。据我所知,画笔不能模糊。因此,我给了他模糊图像的选项,然后将其绘制为堆栈面板的背景。 MSDN 上已经给出了相同的提示...social.msdn.microsoft.com/Forums/en-US/wpf/thread/… 他的应用程序中没有图像。【参考方案3】:

您可以在 Systems.Window 上使用 SetWindowCompositionAttribute,但随后您必须将 WindowStyle 设置为“None”并实现您自己的本机 Window 功能和句柄。从自定义控件继承也相当复杂。长话短说,还有 BlurryControls。

您可以通过 NuGet 浏览“BlurryControls”或在 GitHub 上自行查看代码来找到它。不管怎样,我希望这会有所帮助。它使用 .NET 4.5.2 并且仅适用于 Windows10,因为在 Windows8 上没有解决此问题的方法,而在早期版本(Windows7 和 Vista)中,您可以通过访问 DwmEnableBlurBehindWindow 来实现。 p>

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

【讨论】:

【参考方案4】:

您可以将其应用于网格。

<Grid.Background>
   <VisualBrush>
       <VisualBrush.Visual>
          <Image Source="RESOURCES/BACKGROUNDS/BACKGROUND_01.jpg">
             <Image.BitmapEffect>
                <BlurBitmapEffect KernelType="Gaussian" Radius="20" />
             </Image.BitmapEffect>
          </Image>
       </VisualBrush.Visual>
    </VisualBrush>
 </Grid.Background>

【讨论】:

为什么不使用 UIElement.Effect 属性? &lt;Grid&gt;&lt;UIElement.Effect&gt;&lt;BlurEffect Radius="5" KernelType="Gaussian"/&gt;&lt;/UIElement.Effect&gt;&lt;/Grid&gt; 它也被接受,但就我而言 [3-4 年前] 我使用了我的。并且成功了。

以上是关于模糊 WPF 容器的背景的主要内容,如果未能解决你的问题,请参考以下文章

boostrap 怎么可以让div背景模糊 字不模糊

Direct2D,WPF D3D10 图像在调整大小时模糊

iOS 自定义键盘模糊视图作为背景

WPF阴影设置及设置导致控件模糊问题

WPF 外发光效果

文本渲染仍然模糊:WPF 应用程序的最佳字体?