¿Cómo crear una ventana de WPF sin un borde que se puede cambiar de tamaño solo mediante un agarre?

Si configura ResizeMode="CanResizeWithGrip" en una Window WPF, se muestra un control de cambio de tamaño en la esquina inferior derecha, como se muestra a continuación:

Si configura WindowStyle="None" también, la barra de título desaparece pero el borde biselado gris permanece hasta que configure ResizeMode="NoResize" . Desafortunadamente, con esta combinación de propiedades establecidas, el agarre de cambio de tamaño también desaparece.

He anulado la ControlTemplate la Window través de un Style personalizado. Quiero especificar el borde de la ventana yo mismo, y no necesito que los usuarios puedan cambiar el tamaño de la ventana desde los cuatro lados, pero sí necesito un control de tamaño.

¿Alguien puede detallar una forma simple de cumplir con todos estos criterios?

  1. No tengo un borde en la Window aparte del que yo mismo especifico en una ControlTemplate .
  2. Tiene un agarre de cambio de tamaño en funcionamiento en la esquina inferior derecha.
  3. No tiene una barra de título.

Si configura la propiedad AllowsTransparency en la Window (incluso sin establecer ningún valor de transparencia), el borde desaparece y solo puede cambiar el tamaño a través del control.

    

El resultado se ve así:

Estaba intentando crear una ventana sin WindowStyle="None" con WindowStyle="None" pero cuando lo probé, parece que aparece una barra blanca en la parte superior, después de algunas investigaciones parece ser un “Resize border”, aquí hay una imagen (observé en amarillo):

El reto

Después de algunas investigaciones en Internet, y muchas soluciones difíciles no xaml, todas las soluciones que encontré eran código en C # y muchas líneas de código, encontré indirectamente la solución aquí: La ventana personalizada máxima pierde efecto de sombra

    

Nota : Necesita usar .NET Framework 4.5, o si está usando una versión anterior, use WPFShell, simplemente haga referencia al shell y use Shell:WindowChrome.WindowChrome en Shell:WindowChrome.WindowChrome lugar.

WindowChrome propiedad WindowChrome de Window, si usa esto, el “borde de cambio de tamaño” desaparecerá, pero necesita definir algunas propiedades para que funcionen correctamente.

CaptionHeight: esta es la altura del área de título (barra de encabezado) que permite el ajuste de Aero, haciendo doble clic como lo hace una barra de título normal. Establezca esto en 0 (cero) para que los botones funcionen.

ResizeBorderThickness: Este es el grosor en el borde de la ventana, que es donde puede cambiar el tamaño de la ventana. Puse a 5 porque me gusta ese número, y porque si pone cero es difícil cambiar el tamaño de la ventana.

Después de usar este código corto el resultado es este:

La solución

Y ahora, el borde blanco desapareció sin usar ResizeMode="NoResize" y AllowsTransparency="True" , también muestra una sombra en la ventana.

Más adelante explicaré cómo hacer para que funcionen los botones (no usé imágenes para los botones) fácilmente con código simple y corto, soy nuevo y creo que puedo publicar en codeproject, porque aquí no encontré el lugar para publicar el tutorial.

Tal vez haya otra solución (sé que hay soluciones difíciles y difíciles para noobs como yo) pero esto funciona para mis proyectos personales.

Aquí está el código completo

           

¡Gracias!

Si bien la respuesta aceptada es muy cierta, solo quiero señalar que AllowTransparency tiene algunas caídas. No permite que se muestren los controles de ventanas hijo, es decir, WebBrowser, y por lo general obliga a la representación del software que puede tener efectos de rendimiento negativos.

Sin embargo, hay un mejor trabajo.

Cuando desee crear una ventana sin borde que se pueda redimensionar y pueda alojar un control WebBrowser o un control de Marco apuntando a una URL que simplemente no podría, el contenido de dicho control se mostraría vacío.

Encontré una solución alternativa; en la ventana, si configura WindowStyle en None, ResizeMode en NoResize (aguénteme, todavía podrá cambiar el tamaño una vez hecho) luego asegúrese de que tiene una ventana de tamaño estático sin borde y mostrará el control del navegador.

Ahora, probablemente aún quieras poder cambiar el tamaño, ¿verdad? Bueno, podemos hacerlo con una llamada de interoperabilidad:

  [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImportAttribute("user32.dll")] public static extern bool ReleaseCapture(); //Attach this to the MouseDown event of your drag control to move the window in place of the title bar private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown { ReleaseCapture(); SendMessage(new WindowInteropHelper(this).Handle, 0xA1, (IntPtr)0x2, (IntPtr)0); } //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown { HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource; SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero); } 

Y listo, una ventana de WPF sin bordes y aún movible y de tamaño variable sin perder compatibilidad con controles como WebBrowser

Muestra aquí: