Wie ein WPF-Fenster ohne Rahmen zu schaffen, die nur über einen Griff der Größe verändert werden können?

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

Frage

Wenn Sie ResizeMode="CanResizeWithGrip" auf einer WPF Window stellen Sie dann ein Resize-Griff in der rechten unteren Ecke des Bildschirms angezeigt wird, wie folgt:

Wenn Sie WindowStyle="None" als auch in der Titelleiste gesetzt verschwindet aber die graue abgeschrägte Kante bleibt, bis Sie ResizeMode="NoResize" eingestellt. Leider mit dieser Kombination von Eigenschaften festgelegt, auch die Größe ändert Griff verschwindet.

Ich habe die Window des ControlTemplate über eine benutzerdefinierte Style außer Kraft gesetzt. Ich möchte den Rand des Fensters spezifizieren mich, und ich brauche keine Benutzer in der Lage sein, das Fenster von allen vier Seiten, um die Größe, aber ich habe ein Resize Griff brauchen.

Kann jemand Detail eine einfache Möglichkeit, alle diese Kriterien zu erfüllen?

  1. Nicht haben eine Grenze auf der Window abgesehen von der, die ich mich in einem ControlTemplate angeben.
  2. Do hat eine Arbeits Griff in der rechten unteren Ecke Größe ändern.
  3. Nicht eine Titelleiste haben.
War es hilfreich?

Lösung

Wenn Sie die AllowsTransparency Eigenschaft auf dem Window gesetzt (auch ohne Transparenzwert einstellen) die Grenze verschwindet und Sie können 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 wie folgt aussieht:

  

Andere Tipps

Ich habe versucht, ein randloses Fenster mit WindowStyle="None" zu schaffen, aber wenn ich es getestet, scheine, dass ein weißen Balken in der Spitze erscheint, nach einigen Recherchen scheint es eine „Größe ändern Grenze“ zu sein, hier ist ein Bild (bemerkte ich in gelb):

Die Herausforderung

Nach einigen Recherchen über das Internet, und viele schwierige nicht XAML-Lösungen sind alle Lösungen, die ich waren Code hinter in C # gefunden und viele Codezeilen, fand ich die Lösung indirekt hier: Maximum benutzerdefinierte Fenster verliert Effekt Schlagschatten

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

Hinweis : Sie müssen .NET 4.5-Framework verwenden, oder wenn Sie eine ältere Version verwenden WPFShell verwenden, nur die Schale verweisen und verwenden Shell:WindowChrome.WindowChrome statt

Ich benutzte die WindowChrome Eigenschaft Fenster, wenn Sie diese verwenden, dass weiße „Größe ändern Grenze“ verschwindet, aber Sie müssen einige Eigenschaften zu definieren, um korrekt zu arbeiten.

CaptionHeight: Dies ist die Höhe des Beschriftungsbereich (headerbar), die für die Aero Snap, Doppelklickverhalten als ein normaler Titelleiste ermöglicht es der Fall ist. Setzen Sie diesen Wert auf 0 (Null), um die Tasten arbeiten.

ResizeBorderThickness: Dies ist Stärke am Rand des Fensters, das ist, wo Sie die Größe des Fensters kann. Ich habe bis 5, weil Ich mag diese Zahl, und weil, wenn Sie setzen Null sein schwieriges die Größe des Fensters.

In diesem kurzen Code Nach der Anwendung ist das Ergebnis so aus:

Die Lösung

Und nun, die weiße Grenze verschwand ohne ResizeMode="NoResize" und AllowsTransparency="True" zu verwenden, auch zeigt es einen Schatten im Fenster.

Später werde ich erklären, wie man die Tasten arbeiten (ich habe Bilder für die Tasten nicht verwendet) leicht mit einfachen und kurzen Code, Im neu und ich denke, dass ich auf Codeproject veröffentlichen können, hier, weil ich es nicht tat finden Sie den Ort, das Tutorial zu schreiben.

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

Dies ist der komplette 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>

Danke!

Während die akzeptierte Antwort sehr wahr ist, will nur darauf hinweisen, dass AllowTransparency einige Stürze hat. Dabei spielt es keine Child-Fenster Steuerelemente erlauben zu zeigen, dh WebBrowser, und es zwingt in der Regel Software-Rendering, die negativen Performance Auswirkungen haben kann.

Es gibt eine bessere Arbeit um though.

Wenn Sie ein Fenster ohne Rahmen zu schaffen, die resizeable ist und in der Lage, ein WebBrowser-Steuerelement oder ein Frame-Steuerelement zu einer URL können Sie einfach nicht darauf auszurichten, würde der Inhalt des Steuer leer zeigen.

Ich fand allerdings eine Abhilfe; wenn Sie die Window zu None, ResizeMode zu noresize im Fenster, gesetzt (mit mir tragen, werden Sie noch in der Lage sein, einmal getan, um die Größe), dann stellen Sie sicher, haben Sie UNCHECKED AllowsTransparency Sie eine statische Größe Fenster ohne Rand haben und zeigen, die Browser-Steuerung.

Nun, werden Sie wahrscheinlich noch wollen in der Lage sein Recht auf die Größe? Nun können wir mit einem Interop-Aufruf an das:

    [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 noch beweglich und veränderbar, ohne die Kompatibilität zu verlieren mit mit Kontrollen wie WebBrowser

Beispiel 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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top