模糊 WPF 容器的背景
Posted
技术标签:
【中文标题】模糊 WPF 容器的背景【英文标题】:Blur the background of the WPF container 【发布时间】:2011-12-10 13:05:26 【问题描述】:最终,我想要实现的是在某种程度上复制 WPF 内容控件的 Aero 玻璃功能。
如果我将BlurEffect
应用于包含TextBlock
的StackPanel
,我将模糊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 属性?<Grid><UIElement.Effect><BlurEffect Radius="5" KernelType="Gaussian"/></UIElement.Effect></Grid>
它也被接受,但就我而言 [3-4 年前] 我使用了我的。并且成功了。以上是关于模糊 WPF 容器的背景的主要内容,如果未能解决你的问题,请参考以下文章