Размытие фона контейнера WPF - PullRequest
9 голосов
/ 19 октября 2011

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

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

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

Нет размытия

no blur

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

with blur

Но есть ли в WPF способ размытия фона позади панели, а не его содержимого?

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

Ответы [ 4 ]

7 голосов
/ 19 октября 2011

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

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

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

В вашем примере это ничего не изменит. Что именно вы пытаетесь размыть?

1 голос
/ 31 августа 2016

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

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

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

1 голос
/ 19 октября 2011

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

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

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

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

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

ИЛИ

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

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

0 голосов
/ 04 января 2019

Вы можете применить это к сетке.

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