Blur the background of the WPF container
Asked Answered
K

4

13

Ultimately, what I want to achieve is a replication to some extend, of an Aero glass functionality of a WPF content control.

If I apply the BlurEffect to a StackPanel that contains a TextBlock, I will have the TextBlock's text blurred.

Consider an examples:

No blur

no blur

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

with blur

But is there a WPF way to blur the background behind the panel, and not it's contents?

The background of the StackPanel is a desktop, and the window that hosts it is set to AllowTransparency="True" to allow the custom-shaped look.

Klaraklarika answered 19/10, 2011 at 0:24 Comment(2)
Notice that the background isn't blurred in your second image, just the text. I'm not sure how easy it will be to get the effect you want. This quesiton says something about implementing custom shaders... #1304847 Maybe that would help.Lifeboat
Also check out this p/Invoke stuff to use the native glass API: dotnet.dzone.com/articles/aero-glass-wpf-windowLifeboat
C
3

What the background of the StackPanel? an ImageBrush? If so why cant you apply BlurEffect to that?

If that is not possible then try this..

1] Use an image and draw it completely over Grid as I see you dont want a TileEffect. Add BlurEffect to this Image. Make sure you fill image the uniformly.

2] Then add StackPanel with transparent background as next child in the Grid i.e. dont reverse the order of image and stackpanel.

3] Then add TextBlock in StackPanel.

OR

If you insist on using a Brush to be set as the backgrounnd of the panel then use VisualBrush that draws a blurred image as background of the stackpanel, instead of ImageBrush.

Let me know if any of these tips help.

Chiaki answered 19/10, 2011 at 5:41 Comment(3)
He's trying to blur the windows desktop background not some element in WPF.Ce
Thats what I am trying to help him with. as far as I know, brushes cannot be blurred. Hence I gave him options to blur the image and then draw it as a background of the stackpanel. Same hint is already given on MSDN... social.msdn.microsoft.com/Forums/en-US/wpf/thread/…Chiaki
He doesn't have the image in his application.Ce
H
18

no, it is not possible. The Effect is applied to the element and all its children but you can easily place the TextBlock outside the container, rather than inside it.

Normally you would use a grid like so:

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

In your example that will make no difference though. What, exactly, are you trying to blur?

Heinous answered 19/10, 2011 at 6:5 Comment(1)
You'd have to put the image in the part that got blurred. Notice that the background in that image isn't blurry, even though the text is...Lifeboat
C
3

What the background of the StackPanel? an ImageBrush? If so why cant you apply BlurEffect to that?

If that is not possible then try this..

1] Use an image and draw it completely over Grid as I see you dont want a TileEffect. Add BlurEffect to this Image. Make sure you fill image the uniformly.

2] Then add StackPanel with transparent background as next child in the Grid i.e. dont reverse the order of image and stackpanel.

3] Then add TextBlock in StackPanel.

OR

If you insist on using a Brush to be set as the backgrounnd of the panel then use VisualBrush that draws a blurred image as background of the stackpanel, instead of ImageBrush.

Let me know if any of these tips help.

Chiaki answered 19/10, 2011 at 5:41 Comment(3)
He's trying to blur the windows desktop background not some element in WPF.Ce
Thats what I am trying to help him with. as far as I know, brushes cannot be blurred. Hence I gave him options to blur the image and then draw it as a background of the stackpanel. Same hint is already given on MSDN... social.msdn.microsoft.com/Forums/en-US/wpf/thread/…Chiaki
He doesn't have the image in his application.Ce
S
3

You can use the SetWindowCompositionAttribute on a Systems.Window, but you are then forced to set the WindowStyle to "None" and implement your own native Window funtionality and handles. Also inheriting from a custom control is quite complicated. Long story short, there's BlurryControls.

You can find it via NuGet by browsing for "BlurryControls" or check out the code yourself on GitHub. Eitherway, I hope this is helpful. It uses .NET 4.5.2 and only works for Windows10, since there is no solution to this problem on Windows8, and in earlier versions (Windows7 and Vista) you can achieve this by accessing DwmEnableBlurBehindWindow.

On GitHub you will also find a sample application called BlurryWindowInvoker.

Supererogation answered 31/8, 2016 at 18:58 Comment(0)
T
1

You could apply this to a Grid.

<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>
Taluk answered 4/1, 2019 at 9:15 Comment(2)
why not use UIElement.Effect Property? <Grid><UIElement.Effect><BlurEffect Radius="5" KernelType="Gaussian"/></UIElement.Effect></Grid>Restaurant
It's also accepted, but in my case [3-4 years ago] i used mine. and it's worked.Taluk

© 2022 - 2024 — McMap. All rights reserved.