Domanda

Se imposti ResizeMode = " CanResizeWithGrip " su una Window di WPF, nell'angolo in basso a destra viene mostrato un grip di ridimensionamento, come di seguito:

Se imposti WindowStyle = " None " anche la barra del titolo scompare ma il bordo smussato grigio rimane finché non imposti ResizeMode = " NoResize " . Sfortunatamente, con questa combinazione di proprietà impostata, anche il grip di ridimensionamento scompare.

Ho ignorato la finestra ControlTemplate tramite un Style personalizzato. Voglio specificare il bordo della finestra e non ho bisogno che gli utenti siano in grado di ridimensionare la finestra da tutti e quattro i lati, ma ho bisogno di un grip di ridimensionamento.

Qualcuno può dettagliare un modo semplice per soddisfare tutti questi criteri?

  1. Non non è presente un bordo nella Finestra oltre a quello che ho specificato in un ControlTemplate .
  2. Esegui un grip di ridimensionamento funzionante nell'angolo in basso a destra.
  3. Non non ha una barra del titolo.
È stato utile?

Soluzione

Se imposti la proprietà AllowsTransparency sulla Window (anche senza impostare alcun valore di trasparenza) il bordo scompare e puoi ridimensionare solo tramite il 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>

Il risultato è simile a:

  

Altri suggerimenti

Stavo cercando di creare una finestra senza bordi con WindowStyle = " None " ma quando l'ho provato sembra che appaia una barra bianca in alto, dopo alcune ricerche sembra essere un " ; Ridimensiona bordo " ;, ecco un'immagine (ho notato in giallo):

The Challenge

Dopo alcune ricerche su Internet e molte soluzioni difficili non xaml, tutte le soluzioni che ho trovato erano codice dietro in C # e molte linee di codice, ho trovato indirettamente la soluzione qui: La finestra personalizzata massima perde l'effetto ombra esterna

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

Nota : è necessario utilizzare il framework .NET 4.5 oppure, se si utilizza una versione precedente, utilizzare WPFShell, fare semplicemente riferimento alla shell e utilizzare Shell: WindowChrome.WindowChrome invece.

Ho usato la proprietà WindowChrome di Window, se la usi con quel bordo bianco "ridimensiona" scompare, ma è necessario definire alcune proprietà per funzionare correttamente.

CaptionHeight: questa è l'altezza dell'area dei sottotitoli (barra delle intestazioni) che consente lo snap Aero, facendo doppio clic sul comportamento di una normale barra del titolo. Impostalo su 0 (zero) per far funzionare i pulsanti.

ResizeBorderThickness: questo è lo spessore sul bordo della finestra dove è possibile ridimensionare la finestra. Ho messo a 5 perché mi piace quel numero e perché se si mette a zero è difficile ridimensionare la finestra.

Dopo aver usato questo codice funzione il risultato è questo:

La soluzione

E ora, il bordo bianco è scomparso senza usare ResizeMode = " NoResize " e AllowsTransparency = " True " , inoltre mostra un'ombra nella finestra.

Più avanti spiegherò come far funzionare i pulsanti (non ho usato le immagini per i pulsanti) facilmente con un codice semplice e breve, sono nuovo e penso di poter pubblicare su codeproject, perché qui non ho trova il posto dove pubblicare il tutorial.

Forse esiste un'altra soluzione (so che esistono soluzioni dure e difficili per nessuno come me) ma questo funziona per i miei progetti personali.

Ecco il codice completo

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

Grazie!

Mentre la risposta accettata è molto vera, voglio solo sottolineare che AllowTransparency ha alcuni inconvenienti. Non consente la visualizzazione dei controlli delle finestre figlio, ad esempio WebBrowser, e di solito impone il rendering del software che può avere effetti negativi sulle prestazioni.

C'è comunque un modo migliore per aggirare.

Quando si desidera creare una finestra senza bordo ridimensionabile ed è in grado di ospitare un controllo WebBrowser o un controllo Frame puntato a un URL che semplicemente non è possibile, il contenuto di tale controllo appare vuoto.

Tuttavia ho trovato una soluzione alternativa; nella finestra, se imposti WindowStyle su None, ResizeMode su NoResize (abbi pazienza, sarai comunque in grado di ridimensionare una volta fatto) quindi assicurati di avere UNCHECKED AllowsTransparency avrai una finestra di dimensioni statiche senza bordo e mostrerai il controllo del browser.

Ora, probabilmente vuoi ancora essere in grado di ridimensionare, giusto? Bene, possiamo farlo con una chiamata di interoperabilità:

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

E voilà, una finestra WPF senza bordi e comunque mobile e ridimensionabile senza perdere la compatibilità con controlli come WebBrowser

Esempio qui:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top