Flou derrière une fenêtre WPF transparente

J’essaie de créer une application WPF avec une fenêtre semi-transparente et sans bordure qui estompée.

Voici un exemple de ce que je veux faire. Capture d’écran

J’ai essayé d’utiliser DwmEnableBlurBehindWindow qui ne fonctionne que sous Windows Vista / 7.

J’essaie de trouver une solution qui fonctionnera sous Windows 7, 8 et 10.

Pour les personnes intéressées, j’ai trouvé une solution pour Windows 10, il semble que ce n’est pas possible sous Windows 8, comme l’a mentionné David Heffernan, DwmEnableBlurBehindWindow a été supprimé de Windows 8, mais Microsoft a réintroduit une solution permettant d’atteindre cet effet dans Windows. dix.

  • Windows 10: Solution utilisant SetWindowCompositionAtsortingbute
  • Windows 8: pas de solution
  • Windows 7: vous pouvez continuer à utiliser DwmEnableBlurBehindWindow

J’espère que je ne suis pas en retard à la fête. Vous pouvez utiliser SetWindowCompositionAtsortingbute, mais vous êtes ensuite obligé de définir WindowStyle sur “None” et d’implémenter vos propres fonctionnalités et descripteurs de fenêtre natifs. De plus, hériter d’un contrôle personnalisé est assez compliqué. Cependant, longue histoire courte. Il y a BlurryControls.

Vous pouvez le trouver via NuGet en cherchant “BlurryControls” ou en vérifiant le code vous-même sur GitHub . De toute façon, j’espère que cela vous sera utile.

Sur GitHub, vous trouverez également un exemple d’application.

Windows 8

Même s’il s’agit d’une impasse qu’il serait préférable d’oublier complètement, nous devrons peut-être nous assurer que nos programmes se comportent de manière cohérente d’une version à l’autre. S’il n’est pas nécessaire de disposer d’un arrière-plan dynamic, en particulier si la fenêtre est relativement petite (un candidat idéal serait une boîte de message ou similaire sur notre propre fenêtre d’application), la solution consistant à capturer l’écran derrière la fenêtre et à le rendre flou manuellement peut fonctionner. . Dans le gestionnaire d’événements 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 est une Border extérieure, normalement laissée complètement vide, utilisée uniquement sous Windows 8.

La fonction d’assistance est la conversion bitmap habituelle:

 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() est mieux résolu avec un package de manipulation de bitmap direct tel que WriteableBitmapEx , avec les modifications nécessaires .

Microsoft a supprimé les effets de verre à partir de Windows 8. Cela explique pourquoi l’effet de flou attendu n’est pas observé sous Windows 8 et versions ultérieures. Vous devrez apprendre à vivre sans cela sur ces systèmes d’exploitation.