Pregunta

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

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

He anulado la Ventana de la ControlTemplate a 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 cambio de tamaño.

¿Puede alguien detallar una manera simple de cumplir con todos estos criterios?

  1. No tiene un borde en la Window aparte del que yo especifiqué en una ControlTemplate .
  2. ¿Tiene un agarre de cambio de tamaño que funcione en la esquina inferior derecha.
  3. No tiene una barra de título.
¿Fue útil?

Solución

Si establece 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.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="640" Height="480" 
    WindowStyle="None"
    AllowsTransparency="True"
    ResizeMode="CanResizeWithGrip">

    <!-- Content -->

</Window>

El resultado se ve así:

  

Otros consejos

Estaba tratando de 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 algunas investigaciones parece ser un " ; Cambiar tamaño de borde '', aquí hay una imagen (lo señalé en amarillo):

El desafío

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

<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

Nota : debe 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 su lugar.

Usé la propiedad WindowChrome de Window, si usas esto ese blanco "cambia el tamaño del borde" desaparece, pero debe definir algunas propiedades para que funcionen correctamente.

CaptionHeight: Esta es la altura del área de subtítulos (barra de encabezado) que permite el comportamiento Aero snap, 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 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 los botones funcionen (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 lo hice encuentra el lugar para publicar el tutorial.

Quizás 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

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Concursos"
    mc:Ignorable="d"
    Title="Concuros" Height="350" Width="525"
    WindowStyle="None"
    WindowState="Normal" 
    ResizeMode="CanResize"
    >
<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

    <Grid>

    <Rectangle Fill="#D53736" HorizontalAlignment="Stretch" Height="35" VerticalAlignment="Top" PreviewMouseDown="Rectangle_PreviewMouseDown" />
    <Button x:Name="Btnclose" Content="r" HorizontalAlignment="Right" VerticalAlignment="Top" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmax" Content="2" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,35,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmin" Content="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,70,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>

</Grid>

¡Gracias!

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

Sin embargo, hay una mejor solución.

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

Sin embargo, encontré una solución alternativa; en la ventana, si establece WindowStyle en None, ResizeMode en NoResize (tenga paciencia conmigo, aún podrá cambiar el tamaño una vez hecho), luego asegúrese de tener UNCHECKED AllowsTransparency, tendrá una ventana de tamaño estático 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

Muestra aquí:

<Style TargetType="Window" x:Key="DialogWindow">
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="ResizeMode" Value="CanResizeWithGrip"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}" Background="Gray">
                        <DockPanel>
                            <Grid DockPanel.Dock="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition></ColumnDefinition>
                                    <ColumnDefinition Width="50"/>
                                </Grid.ColumnDefinitions>
                                <Label Height="35" Grid.ColumnSpan="2"
                                       x:Name="PART_WindowHeader"                                            
                                       HorizontalAlignment="Stretch" 
                                       VerticalAlignment="Stretch"/>
                                <Button Width="15" Height="15" Content="x" Grid.Column="1" x:Name="PART_CloseButton"/>
                            </Grid>
                            <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                        Background="LightBlue" CornerRadius="0,0,10,10" 
                                        Grid.ColumnSpan="2"
                                        Grid.RowSpan="2">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="20"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="20"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <ResizeGrip Width="10" Height="10" Grid.Column="1" VerticalAlignment="Bottom" Grid.Row="1"/>
                                </Grid>
                            </Border>
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top