Comment créer une fenêtre WPF sans bordure qui peut être redimensionnée via une poignée seulement?

si vous positionnez ResizeMode="CanResizeWithGrip" sur un WPF Window alors une prise redimensionnée est affichée dans le coin inférieur droit, comme ci-dessous:

si vous mettez WindowStyle="None" aussi la barre de titre disparaît mais le bord biseauté gris reste jusqu'à ce que vous mettiez ResizeMode="NoResize" . Malheureusement, avec cette combinaison de propriétés définie, la prise redimensionner disparaît également.

j'ai dépassé le Window 's ControlTemplate via une coutume Style . Je veux spécifier la bordure de la fenêtre moi-même, et je n'ai pas besoin que les utilisateurs puissent redimensionner la fenêtre des quatre côtés, mais j'ai besoin d'une prise redimensionner.

Quelqu'un peut-il détailler une façon simple de répondre à tous ces critères?

  1. Ne pas ont une bordure sur le Window en dehors de celui que j'spécifier moi-même dans une ControlTemplate .
  2. Faire avoir une poignée de redimensionnement dans le coin inférieur droit.
  3. Ne pas avoir une barre de titre.
77
demandé sur Laurel 2009-03-04 19:17:53

4 réponses

si vous définissez la propriété AllowsTransparency sur le Window (même sans définir de valeurs de transparence) la bordure disparaît et vous ne pouvez redimensionner que via le grip.

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

résultat ressemble à:

161
répondu ZombieSheep 2017-07-20 12:19:01

j'ai essayé de créer une fenêtre sans frontières avec WindowStyle="None" mais quand je l'ai testé, semble que apparaît une barre blanche dans le haut, après quelques recherches, il semble être un "redimensionner la frontière", voici une image (j'ai remarqué en jaune): "15198090920"

The Challenge

après quelques recherches sur internet, et beaucoup de solutions non xaml difficiles, toutes les solutions que j'ai trouvé étaient code derrière en C# et beaucoup de lignes de code, j'ai trouvé indirectement la solution ici: maximum la fenêtre personnalisée perd l'effet d'ombre de goutte

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

Note : vous devez utiliser .NET 4.5 framework, ou si vous utilisez une version plus ancienne utiliser WPFShell, il suffit de faire référence à l'interpréteur de commandes et d'utiliser Shell:WindowChrome.WindowChrome à la place.

j'ai utilisé la propriété WindowChrome de Window, si vous utilisez ce que le blanc" redimensionner la frontière " disparaît, mais vous devez définir certaines propriétés pour fonctionner correctement.

légende: il s'agit de la hauteur de la zone de légende (en-tête) qui permet le claquement de L'Aero, double cliquetis comportement comme une barre de titre normale. Réglez cette valeur à 0 (zéro) pour que les boutons fonctionnent.

Reizeborderthickness: c'est l'épaisseur au bord de la fenêtre qui est où vous pouvez redimensionner la fenêtre. J'ai mis 5 parce que j'aime ce nombre, et parce que si vous mettez zéro, c'est difficile de redimensionner la fenêtre.

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

The Solution

et maintenant, la bordure blanche a disparu sans utiliser ResizeMode="NoResize" et AllowsTransparency="True" , elle montre aussi une ombre dans la fenêtre.

plus tard, je vous expliquerai comment faire fonctionner les boutons (Je n'ai pas utilisé d'images pour les boutons) facilement avec du code simple et court, Je suis nouveau et je pense que je peux poster sur codeproject, parce que Ici, je n'ai pas trouvé l'endroit pour poster le tutoriel.

peut-être qu'il y a une autre solution (je sais qu'il y a des solutions dures et difficiles pour les 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!

50
répondu Fernando Aguirre 2017-05-23 12:17:53

alors que la réponse acceptée est très vraie, je veux juste souligner que AllowTransparency a quelques inconvénients. Il ne permet pas aux commandes de fenêtre enfant d'apparaître, c'est-à-dire WebBrowser, et il force habituellement le rendu du logiciel qui peut avoir des effets de performance négatifs.

Il ya un meilleur travail autour cependant.

quand vous voulez créer une fenêtre sans bordure qui est redimensionnable et est capable d'héberger un contrôle WebBrowser ou un contrôle de cadre pointé vers une URL que vous ne pouviez tout simplement pas, le contenu de ladite commande afficherait vide.

j'ai trouvé une solution de contournement cependant; dans la fenêtre, si vous mettez le WindowStyle à None, ResizeMode à NoResize (avec moi, vous serez toujours en mesure de redimensionner une fois fait) alors assurez-vous que vous avez unchecked AllowsTransparency vous aurez une fenêtre de taille statique sans bordure et affichera le contrôle du navigateur.

Maintenant, vous voulez probablement encore être en mesure de redimensionner droite? Eh bien, nous pouvons à cela avec un interop appel:

    [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 voila, une fenêtre WPF sans frontière et toujours mobile et redimensionnable sans perdre la compatibilité avec les contrôles comme WebBrowser

34
répondu Wobbles 2014-08-02 12:25:55

Exemple 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>
5
répondu Kebes 2011-11-26 14:02:58