Comment créer une fenêtre WPF sans bordure qui ne peut être redimensionnée que par une poignée?

StackOverflow https://stackoverflow.com/questions/611298

Question

Si vous définissez ResizeMode = "CanResizeWithGrip" sur une fenêtre WPF , une poignée de redimensionnement s'affiche dans le coin inférieur droit, comme indiqué ci-dessous:

Si vous définissez WindowStyle = "Aucun" , la barre de titre disparaît également, mais le bord biseauté gris reste jusqu'à ce que vous définissiez ResizeMode = "NoResize & ". Malheureusement, avec cette combinaison de propriétés définie, la poignée de redimensionnement disparaît également.

J'ai remplacé le ControlTemplate de la fenêtre de la fenêtre via un style personnalisé. Je souhaite spécifier moi-même le bord de la fenêtre et je n'ai pas besoin que les utilisateurs soient en mesure de redimensionner la fenêtre des quatre côtés, mais j'ai besoin d'une poignée de redimensionnement.

Quelqu'un peut-il détailler un moyen simple de respecter tous ces critères?

  1. Ne pas de bordure dans la Fenêtre , à l'exception de celle que je me spécifie dans un ControlTemplate .
  2. Avez-vous une bonne prise de redimensionnement dans le coin inférieur droit.
  3. Ne pas disposer d'une barre de titre.
Était-ce utile?

La solution

Si vous définissez la propriété AllowsTransparency sur la Fenêtre (même sans définir de valeurs de transparence), la bordure disparaît et vous ne pouvez redimensionner que par la poignée.

<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>

Le résultat ressemble à:

  

Autres conseils

J'essayais de créer une fenêtre sans bordure avec WindowStyle = "Aucun" , mais lorsque je l'ai testée, il semble qu'une barre blanche apparaisse au haut de l'écran. Après quelques recherches, cela semble être un " ; Redimensionner la bordure ", voici une image (j’ai remarqué en jaune):

Le défi

Après quelques recherches sur Internet et de nombreuses solutions difficiles non-xaml, toutes les solutions que j’ai trouvées étaient du code en C # et de nombreuses lignes de code, j’ai trouvé indirectement la solution ici: La fenêtre personnalisée maximale perd l'effet d'ombre portée

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

Remarque : vous devez utiliser le framework .NET 4.5 ou, si vous utilisez une version antérieure, utiliser WPFShell, il suffit de référencer le shell et d'utiliser Shell: WindowChrome.WindowChrome à la place.

J'ai utilisé la propriété WindowChrome de Window, si vous utilisez cette "bordure blanche". disparaît, mais vous devez définir certaines propriétés pour fonctionner correctement.

CaptionHeight: il s’agit de la hauteur de la zone de légende (barre d’en-tête) qui permet le claquage Aero, le double-clic comme le fait une barre de titre normale. Définissez ce paramètre sur 0 (zéro) pour que les boutons fonctionnent.

ResizeBorderThickness: il s’agit de l’épaisseur au bord de la fenêtre, à partir de laquelle vous pouvez redimensionner la fenêtre. Je mets à 5 parce que j'aime ce nombre, et parce que si vous mettez zéro, il est difficile de redimensionner la fenêtre.

Après avoir utilisé ce code court, le résultat est le suivant:

La solution

Et maintenant, la bordure blanche a disparu sans utiliser ResizeMode = "NoResize" et AllowsTransparency = "True" , une ombre apparaît également dans la fenêtre.

Plus tard, je vais expliquer comment utiliser les boutons (je n’ai pas utilisé d’images pour les boutons) facilement avec un code simple et abrégé. Je suis nouveau et je pense pouvoir envoyer des messages sur codeproject, car ici je n’ai pas trouvez l'endroit où publier le tutoriel.

Peut-être existe-t-il une autre solution (je sais qu'il existe des solutions difficiles pour des noobs comme moi), mais cela fonctionne pour mes projets personnels.

Voici le code complet

<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>

Merci!

Bien que la réponse acceptée soit très vraie, je tiens simplement à souligner que AllowTransparency présente certains inconvénients. Il ne permet pas l'affichage de contrôles de fenêtre enfant, c'est-à-dire WebBrowser, et il force généralement le rendu du logiciel, ce qui peut avoir des effets négatifs sur les performances.

Il existe cependant un meilleur moyen de contourner le problème.

Lorsque vous souhaitez créer une fenêtre sans bordure redimensionnable et pouvant héberger un contrôle WebBrowser ou un contrôle Frame pointant vers une URL que vous ne pouviez tout simplement pas, le contenu de ce contrôle serait vide.

J'ai trouvé une solution de contournement cependant; dans la fenêtre, si vous définissez WindowStyle sur Aucun, ResizeMode sur NoResize (tenez-moi au courant, vous pourrez toujours le redimensionner une fois terminé), puis assurez-vous que l'option UNCHECKED AllowsTransparency est définie. Aucune fenêtre de taille statique, sans bordure, ne s'affiche. le contrôle du navigateur.

Maintenant, vous voulez probablement toujours pouvoir redimensionner, n'est-ce pas? Eh bien, nous pouvons y parvenir avec un appel interop:

    [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);
    }

Et voilà, une fenêtre WPF sans bordure, toujours déplaçable et redimensionnable sans perdre la compatibilité avec des commandes telles que WebBrowser

Échantillon ici:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top