Saltar al contenido

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

Investigamos por distintos sitios para así tenerte la solución para tu inquietud, si continúas con alguna difcultad puedes dejar tu pregunta y te respondemos sin falta, porque estamos para servirte.

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



    


El resultado se parece a:

Estaba intentando crear una ventana sin bordes con WindowStyle="None" pero cuando lo probé, parece que aparece una barra blanca en la parte superior, después de investigar un poco parece ser un “Borde de cambio de tamaño”, aquí hay una imagen (remarqué en amarillo):

El reto

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


    

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

Usé el WindowChrome propiedad de Window, si usa esto, ese “borde de cambio de tamaño” blanco desaparece, pero necesita definir algunas propiedades para que funcione correctamente.

CaptionHeight: Esta es la altura del área de título (barra de encabezado) que permite el ajuste Aero, el comportamiento de doble clic como lo hace una barra de título normal. Ajústelo a 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 5 porque me gusta ese número, y porque si pones 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 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 novatos como yo) pero esto funciona para mis proyectos personales.

Aquí está el código completo



    


    

    
    

¡Gracias!

Si bien la respuesta aceptada es muy true, solo quiero señalar que AllowTransparency tiene algunas desventajas. No permite que aparezcan los controles secundarios de la ventana, es decir, WebBrowser, y normalmente fuerza la renderización del software, lo que puede tener efectos negativos en el rendimiento.

Sin embargo, hay una solución mejor.

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

Sin embargo, encontré una solución alternativa; en la ventana, si establece WindowStyle en Ninguno, ResizeMode en NoResize (tenga paciencia conmigo, aún podrá cambiar el tamaño una vez hecho), luego asegúrese de haber DESCONECTADO AllowsTransparency, tendrá un static ventana de tamaño sin borde y mostrará el control del navegador.

Ahora, probablemente todavía 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 WPF sin borde y aún móvil y redimensionable sin perder compatibilidad con controles como WebBrowser

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *