Estoy tratando de crear una aplicación WPF con una ventana semitransparente sin bordes que difumina el fondo detrás de ella.
Aquí hay un ejemplo de lo que quiero hacer. Captura de pantalla
He intentado usar DwmEnableBlurBehindWindow , que solo funciona en Windows Vista/7.
Estoy tratando de encontrar una solución que funcione en Windows 7, 8 y 10.
Para cualquier persona interesada, encontré una solución para Windows 10. Parece que no es posible en Windows 8, como mencionó David Heffernan, DwmEnableBlurBehindWindow se eliminó de Windows 8, sin embargo, Microsoft reintrodujo una solución para lograr este efecto en Windows. 10
Espero no llegar tarde a la fiesta. Puede usar SetWindowCompositionAttribute, pero luego se ve obligado a establecer WindowStyle en "Ninguno" e implementar su propia funcionalidad y identificadores nativos de Windows. También heredar de un control personalizado es bastante complicado. Sin embargo, larga historia corta. Hay BlurryControls.
Puede encontrarlo a través de NuGet buscando "BlurryControls" o verifique el código usted mismo en GitHub . De todos modos, espero que esto sea útil.
En GitHub también encontrará una aplicación de muestra.
ventanas 8
Por mucho que sea un callejón sin salida que es mejor olvidar por completo, es posible que debamos asegurarnos de que nuestros programas se comporten de manera consistente en todas las versiones. Si no hay necesidad de un fondo dinámico y especialmente si la ventana es relativamente pequeña (un candidato principal sería un cuadro de mensaje o similar sobre nuestra propia ventana de aplicación), la solución de capturar la pantalla detrás de la ventana y desenfocarla manualmente podría funcionar. . En el controlador de eventos 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, }; donde border es un borde más externo Border normalmente se deja completamente vacío, solo se usa en Windows 8.
La función auxiliar es la conversión de mapa de bits habitual:
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() se resuelve mejor con un paquete de manipulación directa de mapas de bits como WriteableBitmapEx , con las modificaciones necesarias.