Размытие фона контейнера WPF

в конечном счете, то, что я хочу достичь, - это репликация в некоторой степени функциональности Aero glass элемента управления содержимым WPF.

если я применю BlurEffect до StackPanel, которая содержит TextBlock, у меня будет TextBlock текст размыт.

Рассмотрим пример:

нет размытости

no blur

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

with blur

но есть ли способ WPF размыть фон за панелью и не содержимое?

фоне StackPanel - это рабочий стол, а окно, в котором он размещается, имеет значение AllowTransparency="True" разрешить пользовательские-образный вид.

3 ответов


что фон StackPanel? методу imagebrush? Если да, то почему вы не можете применить BlurEffect к этому?

если это невозможно, попробуйте это..

1] используйте изображение и нарисуйте его полностью над Grid Как я вижу, вы не хотите TileEffect. Добавить BlurEffect этой Image. Убедитесь, что вы заполняете изображение равномерно.

2] Затем добавить StackPanel С прозрачным фоном как следующего ребенка на Grid т. е. не обратный порядок изображение и stackpanel.

3] Затем добавить TextBlock в StackPanel.

или

если вы настаиваете на использовании Brush для установки в качестве backgrounnd панели затем используйте VisualBrush который рисует размытое изображение в качестве фона stackpanel, а не ImageBrush.

Дайте мне знать, если любой из этих советов поможет.


нет, это невозможно. Эффект применяется к элементу и все его дети но вы можете легко разместить TextBlock вне контейнера, а не внутри него.

обычно вы бы использовали сетку так:

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

в вашем примере это не будет иметь никакого значения. Что именно ты пытаешься размыть?


можно использовать SetWindowCompositionAttribute на систем.Window, но затем вы вынуждены установить WindowStyle в "None" и реализовать собственную собственную функциональность и дескрипторы окна. Также наследование от пользовательского элемента управления довольно сложно. Короче говоря, есть BlurryControls.

вы можете найти его через NuGet для при просмотре "BlurryControls" или проверить код самостоятельно на GitHub. Надеюсь, что так и будет. это полезно. Он использует .NET 4.5.2 и работает только для Windows10, поскольку в Windows8 нет решения этой проблемы, а в более ранних версиях (Windows7 и Vista) вы можете достичь этого, обратившись к DwmEnableBlurBehindWindow.

на GitHub вы также найдете пример приложения под названием BlurryWindowInvoker.