.net tag Wie erstelle ich ein WPF-Fenster ohne einen Rahmen, der nur über einen Griff angepasst werden kann?




title tag (4)

Wenn Sie ResizeMode="CanResizeWithGrip" in einem WPF- Window ResizeMode="CanResizeWithGrip" wird in der unteren rechten Ecke ein Größenanpassungsgriff angezeigt:

Wenn Sie WindowStyle="None" setzen, WindowStyle="None" die Titelleiste, aber die graue abgeschrägte Kante bleibt bestehen, bis Sie ResizeMode="NoResize" . Leider ist mit dieser Kombination von Eigenschaften auch der Größenanpassungsgriff nicht mehr vorhanden.

Ich habe die ControlTemplate des ControlTemplate über einen benutzerdefinierten Style überschrieben. Ich möchte den Rahmen des Fensters selbst angeben, und ich brauche die Größe des Fensters nicht von allen vier Seiten, aber ich brauche einen Größenanpassungsgriff.

Kann jemand einen einfachen Weg beschreiben, all diese Kriterien zu erfüllen?

  1. Ich habe keine Begrenzung für das Window abgesehen von der, die ich selbst in einem ControlTemplate angegeben habe.
  2. Haben Sie einen funktionierenden Größenanpassungsgriff in der unteren rechten Ecke.
  3. Keine Titelleiste

Ich habe versucht, ein Fenster WindowStyle="None" Fenster mit WindowStyle="None" zu erstellen, aber als ich es getestet habe, scheint oben ein weißer Balken zu erscheinen, nach einigem Nachdenken scheint es ein "Resize border" zu sein, hier ist ein Bild (ich bemerkte in Gelb):

Nach einigen Nachforschungen über das Internet und vielen schwierigen non xaml-Lösungen, die ich gefunden habe, waren Code in C # und viele Code-Zeilen, ich fand indirekt die Lösung hier: Maximale benutzerdefinierte Fenster verliert Schlagschatten-Effekt

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

Hinweis : Sie müssen das .NET 4.5-Framework verwenden. Wenn Sie eine ältere Version verwenden, verwenden Sie WPFShell, verweisen Shell:WindowChrome.WindowChrome stattdessen auf die Shell und verwenden Shell:WindowChrome.WindowChrome stattdessen Shell:WindowChrome.WindowChrome .

Ich habe die WindowChrome Eigenschaft von WindowChrome verwendet, wenn Sie dies verwenden, verschwindet der weiße "Rahmen ändern", aber Sie müssen einige Eigenschaften definieren, damit sie korrekt funktionieren.

CaptionHeight: Dies ist die Höhe des Beschriftungsbereichs (Headerbar), die das Verhalten des Aero-Snap-Doppelklicks wie eine normale Titelleiste ermöglicht. Setzen Sie diese auf 0 (Null), damit die Tasten funktionieren.

ResizeBorderThickness: Dies ist die Dicke am Rand des Fensters, an der Sie die Größe des Fensters ändern können. Ich setze auf 5, weil ich diese Zahl mag, und weil, wenn Sie Null setzen, es schwierig ist, das Fenster zu verkleinern.

Nach der Verwendung dieses kurzen Codes ist das Ergebnis:

Und jetzt verschwand der weiße Rand, ohne dass ResizeMode="NoResize" und AllowsTransparency="True" , und auch ein Schatten im Fenster.

Später werde ich erklären, wie man die Knöpfe (ich habe keine Bilder für die Knöpfe verwendet) leicht mit dem einfachen und kurzen Code machen konnte, ich bin neu und ich denke, dass ich zum Codeprojekt posten kann, weil ich hier den Platz nicht gefunden habe um das Tutorial zu posten.

Vielleicht gibt es eine andere Lösung (ich weiß, dass es für Noobs wie mich harte und schwierige Lösungen gibt), aber das funktioniert für meine persönlichen Projekte.

Hier ist der vollständige Code

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

Vielen Dank!


Probe hier:

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

Während die akzeptierte Antwort sehr wahr ist, möchte ich nur darauf hinweisen, dass AllowTransparency einige Fehler aufweist. Es erlaubt keine untergeordneten Fenstersteuerelemente, z. B. WebBrowser, und es erzwingt normalerweise das Softwarerendering, das negative Leistungseffekte haben kann.

Es gibt jedoch eine bessere Arbeit.

Wenn Sie ein Fenster ohne Rahmen erstellen möchten, dessen Größe geändert werden kann und das ein WebBrowser-Steuerelement oder ein Frame-Steuerelement enthalten kann, das auf eine URL verweist, die Sie einfach nicht sehen können, würde der Inhalt des Steuerelements leer angezeigt.

Ich habe jedoch einen Workaround gefunden. Wenn Sie im Fenster WindowStyle auf None setzen, ResizeMode auf NoResize (bei mir können Sie die Größe ändern, sobald Sie fertig sind) und dann sicherstellen, dass Sie UNCHECKED AllowsTransparency haben, haben Sie ein statisch großes Fenster ohne Rahmen und werden angezeigt die Browsersteuerung.

Jetzt willst du wahrscheinlich noch in der Lage sein, richtig zu skalieren? Gut können wir das mit einem Interop Call:

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

Und voila, Ein WPF-Fenster ohne Rahmen und immer noch beweglich und größenveränderbar, ohne die Kompatibilität mit Steuerelementen wie WebBrowser zu verlieren


Wenn Sie die AllowsTransparency Eigenschaft im Window AllowsTransparency (auch ohne Transparenzwerte), verschwindet der Rahmen und Sie können die Größe nur über den Griff ändern.

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

Ergebnis sieht folgendermaßen aus:







resizegrip