Окно позади размытие прозрачных в WPF

Я пытаюсь создать приложение WPF с полупрозрачным окном без границ, которое размывает фон позади него.

вот пример что я хочу сделать. скриншот

Я пробовал использовать DwmEnableBlurBehindWindow который работает только в windows Vista / 7.

Я пытаюсь найти решение, которое будет работать на Windows 7, 8 и 10.

4 ответов


для всех, кого интересует, я нашел решение для Windows 10, похоже, что это невозможно в Windows 8, как упоминал Дэвид Хеффернан, DwmEnableBlurBehindWindow был удален из Windows 8, однако Microsoft повторно представила решение для достижения этого эффекта в Windows 10.


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

вы можете найти его через NuGet для при просмотре "BlurryControls" или проверить код самостоятельно на GitHub. Надеюсь, это поможет.

на GitHub вы также найдете образец заявления.


Windows 8

как тупик, который лучше полностью забыть, нам может потребоваться убедиться, что наши программы ведут себя последовательно в разных версиях. Если нет необходимости в динамическом фоне, и особенно если окно относительно небольшое (основным кандидатом будет окно сообщения или подобное над нашим собственным окном приложения), решение захвата экрана за окном и размытия его вручную может работать. В Loaded событие обработчик:

var screen = window.Owner.PointToScreen(new System.Windows.Point((window.Owner.ActualWidth - window.ActualWidth) / 2, (window.Owner.ActualHeight - window.ActualHeight) / 2));
var rect = new Rectangle((int)screen.X, (int)screen.Y, (int)window.ActualWidth, (int)window.ActualHeight);
var bitmap = new Bitmap(rect.Width, rect.Height);
using (var graphics = Graphics.FromImage(bitmap))
  graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0, rect.Size);
border.Background = new ImageBrush(ApplyGaussianBlur(bitmap.ToBitmapImage())) {
  TileMode = TileMode.None,
  Stretch = Stretch.None,
  AlignmentX = AlignmentX.Center,
  AlignmentY = AlignmentY.Center,
};

здесь border - Это внешняя Border, обычно оставленный полностью пустым, используется только в Windows 8.

вспомогательная функция-это обычное преобразование растрового изображения:

public static BitmapSource ToBitmapImage(this System.Drawing.Bitmap image) {
  var hBitmap = image.GetHbitmap();
  var bitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
  DeleteObject(hBitmap);
  return bitmap;
}

ApplyGaussianBlur() лучше всего решить с помощью прямого пакета обработки растровых изображений, как WriteableBitmapEx, при необходимых модификации.


Microsoft удалила эффекты стекла, начиная с Windows 8. Это объясняет, почему эффект размытия, который вы ожидаете не наблюдается на Windows 8 и более поздних. Вам придется научиться жить без него в этих операционных системах.