WPF容器背景模糊化

13

我的最终目标是在WPF内容控件中部分复制Aero玻璃功能。

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

考虑以下例子:

没有模糊:

no blur

使用<BlurEffect Radius="5" KernelType="Gaussian"/>后:

with blur

但是是否有WPF方法可以使面板背后的背景变模糊而不是其内容?

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


1
请注意,您的第二张图像中背景没有模糊,只有文本。我不确定您想要的效果有多容易实现。这个问题提到了实现自定义着色器的内容...http://stackoverflow.com/questions/1304347/alternative-of-blur-effect-on-drawingvisual 也许这会有所帮助。 - Merlyn Morgan-Graham
1
还可以查看这个p/Invoke的内容,以使用本地玻璃API:http://dotnet.dzone.com/articles/aero-glass-wpf-window - Merlyn Morgan-Graham
4个回答

16

不,不可能。Effect应用于元素及其所有子级,但您可以轻松地将 TextBlock 放在容器外而不是内部。

通常您会使用如下的网格:

<Grid>
  <Border>
     <Border.Effect>
      <BlurEffect Radius="5" KernelType="Gaussian"/>
     </Border.Effect/>
  </Border>
  <TextBlock .../>
</Grid>
在您的示例中,这不会有任何区别。您到底想要模糊什么?

你需要把图片放在被模糊的部分。请注意,即使文本模糊了,该图像的背景并没有变模糊。 - Merlyn Morgan-Graham

3
您可以在系统窗口上使用SetWindowCompositionAttribute,但这样会强制将WindowStyle设置为“None”,并实现自己的本机窗口功能和句柄。此外,从自定义控件继承也相当复杂。长话短说,有模糊控件可用。
您可以通过浏览“BlurryControls”来在NuGet中找到它,或者自己在GitHub上查看代码。无论哪种方式,我希望这对您有所帮助。它使用.NET 4.5.2,并且仅适用于Windows10,因为在Windows8上没有解决此问题的方法,在早期版本(Windows7和Vista)中,您可以通过访问DwmEnableBlurBehindWindow来实现此目的。
在GitHub上,您还将找到一个名为BlurryWindowInvoker的示例应用程序。

3
什么是StackPanel的背景?是ImageBrush吗?如果是,为什么不能将BlurEffect应用于它?
如果不可能,那就试试这个...
1] 使用图像,将其完全绘制在上,因为我看到你不想要TileEffect。将BlurEffect添加到此图像中。确保您统一填充图像。
2] 然后在中将带有透明背景的StackPanel作为下一个子元素添加,即不要颠倒图像和stackpanel的顺序。
3] 然后在StackPanel中添加TextBlock。

如果您坚持使用Brush作为面板的背景,则可以使用VisualBrush将模糊图像绘制为StackPanel的背景,而不是ImageBrush。
如果这些提示中的任何一个有所帮助,请告诉我。

2
他试图模糊Windows桌面背景,而不是WPF中的某个元素。 - Oggy
这就是我正在尝试帮助他解决的问题。据我所知,画笔无法模糊。因此,我给了他选项,将图像进行模糊处理,然后将其绘制为stackpanel的背景。MSDN上已经给出了相同的提示...http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/12fbdc6d-0850-4379-b357-bc8a0abc03f3 - WPF-it
他的应用程序中没有这个图像。 - Oggy

1

你可以将这个应用到一个网格中。

<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>

1
为什么不使用UIElement.Effect属性呢? <Grid><UIElement.Effect><BlurEffect Radius="5" KernelType="Gaussian"/></UIElement.Effect></Grid> - Kux
这也是可以接受的,但在我的情况下[3-4年前]我使用了我的,并且它起作用了。 - Abdel Moumen Abdel Raouf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接