107 votes

Comment créer une Fenêtre WPF sans frontière qui peut être redimensionné par l'intermédiaire d'une poignée seulement?

Si vous définissez ResizeMode="CanResizeWithGrip" sur un WPF Window puis une poignée de redimensionnement est indiqué dans le coin en bas à droite, comme ci-dessous:

f262e5629f.png

Si vous définissez WindowStyle="None" ainsi la barre de titre disparaît, mais le gris bord biseauté reste jusqu'à ce que vous définissez ResizeMode="NoResize". Malheureusement, avec cette combinaison de définir les propriétés de la poignée de redimensionnement disparaît aussi.

J'ai annulé l' Windows' ControlTemplate via une coutume Style. Je tiens à préciser la frontière de la fenêtre de moi-même, et je n'ai pas besoin les utilisateurs à être en mesure de redimensionner la fenêtre de tous les quatre côtés, mais j'ai besoin d'une poignée de redimensionnement.

Quelqu'un peut détailler un moyen simple de répondre à tous ces critères?

  1. Ne pas avoir une bordure sur l' Window en dehors de celui que j'spécifier moi-même dans une ControlTemplate.
  2. N' ayez une poignée de redimensionnement dans le coin inférieur droit.
  3. Ne pas avoir une barre de titre.

199voto

ZombieSheep Points 18967

Si vous définissez l' AllowsTransparency de la propriété sur l' Window (même sans définir toutes les valeurs de transparence) de la frontière disparaît et vous ne pouvez redimensionner via 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 à ceci:

43voto

Wobbles Points 488

Alors que l'on a accepté la réponse est très vrai, je veux juste faire remarquer que AllowTransparency a quelques inconvénients. Il ne permet pas à l'enfant les commandes de la fenêtre pour montrer, c'est à dire WebBrowser, et c'est souvent les forces de rendu logiciel qui peut avoir des effets sur les performances.

Il est un meilleur travail autour de même si.

Lorsque vous souhaitez créer une fenêtre sans bordure est redimensionnables et est en mesure d'accueillir un contrôle WebBrowser ou d'un Cadre de contrôle pointu à une URL que vous ne pouvait tout simplement pas, le contenu du dit contrôle de montrer vide.

J'ai trouvé une solution de contournement si, dans la Fenêtre, si vous définissez la WindowStyle à Aucun, ResizeMode à NoResize (ours avec moi, vous serez toujours en mesure de redimensionner une fois fait), alors assurez-vous d'avoir DÉCOCHÉ AllowsTransparency vous aurez une statique de la taille de la fenêtre sans frontière et le contrôle du navigateur.

Maintenant, vous avez probablement vous voulez toujours être en mesure de redimensionner droit? Eh bien, nous pouvons à celle d'un appel d'interopérabilité:

    [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 avec pas de frontière et encore déplaçable et redimensionnable sans perte de compatibilité avec les commandes comme WebBrowser

6voto

Kebes Points 59

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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X