2012-12-04 11 views
7

C'è un modo in WPF in cui posso rimuovere il bordo della finestra principale, ma consentire che la finestra venga ridimensionata (senza grip)?Come creare una finestra WPF senza un bordo che può essere ridimensionato?

Mi sono reso conto che c'è un modo per fare questo scenario impostando la modalità di ridimensionamento su CanResizeWithGrip. Tuttavia, voglio essere in grado di farlo con la modalità di ridimensionamento impostata su CanResize.

ho provato impostando la seguente:

ResizeMode="CanResize" 
WindowStyle="None" 
AllowsTransparency="True" 

Tuttavia, impostando AllowsTransparency, elimina la possibilità di ridimensionare, senza la presa. Qualche idea su come posso farcela?

Devo anche notare che non posso impostare lo stato in modo vero, perché sto usando un controllo winformshost nella mia finestra, che non viene mostrato quando AllowsTransparency è vero.

+0

ho deciso di rinnovare solo la mia interfaccia utente, invece, e appena fissato ResizeMode = "CanResize" e lasciato il confine nel tatto. – jsirr13

risposta

-5

Il più semplice, ma forse troppo semplice è

this.MouseLeftButtonDown += delegate { this.DragMove(); }; 
+0

Non voglio necessariamente spostare la finestra, ma semplicemente ridimensionamento quando il bordo (che alla fine voglio solo nascosto) viene trascinato. ESsenzialmente voglio emulare il comportamento generale del ridimensionamento di una finestra, solo con il bordo nascosto. – jsirr13

+0

Quindi dovrai catturare il bordo che stai muovendo e regolare X, Y, W, H a seconda del bordo. – kenny

0

È possibile utilizzare la libreria finestra personalizzabile WPF, disponibile qui: http://wpfwindow.codeplex.com/

Poi, quando si utilizza tipo di finestra della biblioteca, è possibile impostare lo stesso proprietà come elencato sopra

<CustomWindow:EssentialWindow x:Class="CustomWindowDemo.DemoEssentialWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:CustomWindow="clr-namespace:CustomWindow;assembly=CustomWindow" 
    AllowsTransparency="True" ResizeMode="CanResize" WindowStyle="None" Title="EssentialWindow" 
    Height="300" Width="250"> 
+0

Sul loro sito, si dice: La completa personalizzazione della finestra WPF può essere eseguita solo quando AllowsTransparency è impostato su "True". Ancora una volta, sfortunatamente non posso usarlo a causa del bug WinFormsHost, in cui il controllo non viene visualizzato quando AllowsTransparency è impostato su true. Forse se riuscirò a superare il problema, la tua risposta sarebbe una soluzione ideale vicino. – jsirr13

+0

@ jsirr13, non l'ho provato, ma ecco una soluzione su come risolvere WinFormsHost bug http://mrtncls.blogspot.com/2011/07/windowsformshost-on-transparent-wpf.html anche soluzione tramite Win API http: //www.neowin.net/forum/topic/646970-c% 23-wpf-window-with-transparency-makes-windowsformshost-disappear/ –

+0

Ho provato la seconda soluzione, senza fortuna. Proverò la prima soluzione quando avrò tempo. Grazie per il feedback. – jsirr13

1

L'utente deve interagire con qualcosa per ridimensionare la finestra. Se non ti piace il bordo o il grip predefinito, dovrai aggiungere un altro controllo con un clic e trascinare il comportamento che ridimensiona la finestra. Forse una linea su ciascun lato della finestra?

0

Questo può accadere se ResizeBorderThickness è impostato a 0.

Può essere impostato su un valore positivo in XAML come questo:

<WindowChrome> 
    <WindowChrome.ResizeBorderThickness> 
     <Thickness>1</Thickness> 
    </WindowChrome.ResizeBorderThickness> 
</WindowChrome> 
5

So che questa è una vecchia questione, ma volevo solo mettere su un campione funzionante per i nuovi arrivati.

Xaml Window:

<Window x:Class="CustomWindowDemo.DemoCustomWindow" 
     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:CustomWindowDemo" 
     mc:Ignorable="d" 
     Title="DemoCustomWindow" Height="300" Width="300" Background="{x:Null}" AllowsTransparency="True" WindowStyle="None"> 
    <Window.Resources> 
     <Style x:Key="BorderThumb" TargetType="Thumb"> 
      <Setter Property="SnapsToDevicePixels" Value="true" /> 
      <Setter Property="OverridesDefaultStyle" Value="true" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Thumb"> 
         <Rectangle MinWidth="4" MinHeight="4" StrokeThickness="0"> 
          <Rectangle.Fill> 
           <SolidColorBrush Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}" Opacity="0.05"/> 
          </Rectangle.Fill> 
         </Rectangle> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Border BorderBrush="#55FFFFFF" BorderThickness="1" CornerRadius="5"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
      <Border MouseMove="Header_MouseMove" DockPanel.Dock="Top" Height="32" Grid.Row="1" Grid.Column="1"> 
        <Border.Background> 
         <LinearGradientBrush StartPoint="0,0" EndPoint="0,3"> 
          <GradientStop Color="#3BB2EA" Offset="0" /> 
          <GradientStop Color="#EFF7FA" Offset="0.3" /> 
         </LinearGradientBrush> 
        </Border.Background> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="Auto"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0" Text="{Binding Path=Title, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/> 
         <Button x:Name="btn_Minimize" Background="{x:Null}" BorderBrush="{x:Null}" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" BorderThickness="0" Click="btn_Minimize_Click" Grid.Column="1"> 
          <Image Source="Resources/Ahmadhania-Spherical-Minimize.ico"/> 
         </Button> 
         <Button x:Name="btn_Maximize" Background="{x:Null}" BorderBrush="{x:Null}" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" BorderThickness="0" Grid.Column="2" Click="btn_Maximize_Click"> 
          <Image Source="Resources/1412181205_61002.ico"/> 
         </Button> 
         <Button x:Name="btn_Close" Background="{x:Null}" BorderBrush="{x:Null}" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" BorderThickness="0" Grid.Column="3" Click="btn_Close_Click"> 
          <Image Source="Resources/Ahmadhania-Spherical-Close(1).ico"/> 
         </Button> 
        </Grid> 
       </Border> 
      <Thumb x:Name="ThumbBottom" DragDelta="ThumbBottom_DragDelta" HorizontalAlignment="Stretch" Cursor="SizeNS" Grid.Column="0" Background="{x:Null}" Margin="3,0" Grid.ColumnSpan="3" Grid.Row="3" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}"/> 
      <Thumb x:Name="ThumbTop" DragDelta="ThumbTop_DragDelta" HorizontalAlignment="Stretch" Cursor="SizeNS" Grid.Column="0" Background="{x:Null}" Margin="3,0" Grid.ColumnSpan="3" Height="4" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}"/> 
      <Thumb x:Name="ThumbBottomRightCorner" DragDelta="ThumbBottomRightCorner_DragDelta" HorizontalAlignment="Right" Cursor="SizeNWSE" Grid.Row="3" Grid.Column="3" Background="{x:Null}" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}"/> 
      <Thumb x:Name="ThumbTopRightCorner" DragDelta="ThumbTopRightCorner_DragDelta" HorizontalAlignment="Right" Cursor="SizeNESW" Grid.Row="0" Grid.Column="2" Background="{x:Null}" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}"/> 
      <Thumb x:Name="ThumbTopLeftCorner" DragDelta="ThumbTopLeftCorner_DragDelta" HorizontalAlignment="Left" Cursor="SizeNWSE" Grid.Row="0" Grid.Column="0" Background="{x:Null}" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}" /> 
      <Thumb x:Name="ThumbBottomLeftCorner" DragDelta="ThumbBottomLeftCorner_DragDelta" HorizontalAlignment="Left" Cursor="SizeNESW" Grid.Row="3" Grid.Column="0" Background="{x:Null}" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}" /> 
      <Thumb x:Name="ThumbRight" DragDelta="ThumbRight_DragDelta" Cursor="SizeWE" Grid.Column="2" Grid.RowSpan="4" Background="{x:Null}" Margin="0,3" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}"/> 
      <Thumb x:Name="ThumbLeft" DragDelta="ThumbLeft_DragDelta" Cursor="SizeWE" Grid.Column="0" Grid.RowSpan="4" HorizontalContentAlignment="Right" Background="{x:Null}" Margin="0,3" Style="{Binding Mode=OneWay, Source={StaticResource BorderThumb}}"/> 
      <Grid x:Name="Grid_Content" Background="#EFF7FA" Grid.Row="2" Grid.Column="1"> 

      </Grid> 
     </Grid> 
    </Border> 
</Window> 

C# codice dietro:

using System.Windows.Interop; 
using winforms = System.Windows.Forms; 

namespace CustomWindowDemo 
{ 
    /// <summary> 
    /// Interaction logic for DemoCustomWindow.xaml 
    /// </summary> 
    public partial class DemoCustomWindow : Window 
    { 
     bool Maximized = false; 
     int NormalWidth = 0; 
     int NormalHeight = 0; 
     int NormalX = 0; 
     int NormalY = 0; 

     public DemoCustomWindow() 
     { 
      InitializeComponent(); 
     } 

     #region Header & Resize 
     void Header_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) 
       this.DragMove(); 
     } 

     void ThumbBottomRightCorner_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Width + e.HorizontalChange > 10) 
       this.Width += e.HorizontalChange; 
      if (this.Height + e.VerticalChange > 10) 
       this.Height += e.VerticalChange; 
     } 
     void ThumbTopRightCorner_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Width + e.HorizontalChange > 10) 
       this.Width += e.HorizontalChange; 
      if (this.Top + e.VerticalChange > 10) 
      { 
       this.Top += e.VerticalChange; 
       this.Height -= e.VerticalChange; 
      } 
     } 
     void ThumbTopLeftCorner_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Left + e.HorizontalChange > 10) 
      { 
       this.Left += e.HorizontalChange; 
       this.Width -= e.HorizontalChange; 
      } 
      if (this.Top + e.VerticalChange > 10) 
      { 
       this.Top += e.VerticalChange; 
       this.Height -= e.VerticalChange; 
      } 
     } 
     void ThumbBottomLeftCorner_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Left + e.HorizontalChange > 10) 
      { 
       this.Left += e.HorizontalChange; 
       this.Width -= e.HorizontalChange; 
      } 
      if (this.Height + e.VerticalChange > 10) 
       this.Height += e.VerticalChange; 
     } 
     void ThumbRight_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Width + e.HorizontalChange > 10) 
       this.Width += e.HorizontalChange; 
     } 
     void ThumbLeft_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Left + e.HorizontalChange > 10) 
      { 
       this.Left += e.HorizontalChange; 
       this.Width -= e.HorizontalChange; 
      } 
     } 
     void ThumbBottom_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Height + e.VerticalChange > 10) 
       this.Height += e.VerticalChange; 
     } 
     void ThumbTop_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      if (this.Top + e.VerticalChange > 10) 
      { 
       this.Top += e.VerticalChange; 
       this.Height -= e.VerticalChange; 
      } 
     } 

     void btn_Minimize_Click(object sender, RoutedEventArgs e) 
     { 
      WindowState = WindowState.Minimized; 
     } 
     void btn_Maximize_Click(object sender, RoutedEventArgs e) 
     { 
      if (Maximized == true) 
      { 
       this.Width = NormalWidth; 
       this.Height = NormalHeight; 
       this.Left = NormalX; 
       this.Top = NormalY; 
       Maximized = false; 
       Thumbs(); 
      } 
      else 
      { 
       NormalX = (int)this.Left; 
       NormalY = (int)this.Top; 
       NormalHeight = (int)this.Height; 
       NormalWidth = (int)this.Width; 
       this.Left = winforms.Screen.FromHandle(new WindowInteropHelper(this).Handle).WorkingArea.Left; 
       this.Top = winforms.Screen.FromHandle(new WindowInteropHelper(this).Handle).WorkingArea.Top; 
       this.Width = winforms.Screen.FromHandle(new WindowInteropHelper(this).Handle).WorkingArea.Width; 
       this.Height = winforms.Screen.FromHandle(new WindowInteropHelper(this).Handle).WorkingArea.Height; 
       Maximized = true; 
       Thumbs(); 
      } 
     } 
     void btn_Close_Click(object sender, RoutedEventArgs e) 
     { 
      Close(); 
     } 
     void Thumbs() 
     { 
      if (Maximized == true) 
      { 
       ThumbBottom.Visibility = Visibility.Collapsed; 
       ThumbLeft.Visibility = Visibility.Collapsed; 
       ThumbTop.Visibility = Visibility.Collapsed; 
       ThumbRight.Visibility = Visibility.Collapsed; 
       ThumbTopLeftCorner.Visibility = Visibility.Collapsed; 
       ThumbTopRightCorner.Visibility = Visibility.Collapsed; 
       ThumbBottomLeftCorner.Visibility = Visibility.Collapsed; 
       ThumbBottomRightCorner.Visibility = Visibility.Collapsed; 
      } 
      else 
      { 
       ThumbBottom.Visibility = Visibility.Visible; 
       ThumbLeft.Visibility = Visibility.Visible; 
       ThumbTop.Visibility = Visibility.Visible; 
       ThumbRight.Visibility = Visibility.Visible; 
       ThumbTopLeftCorner.Visibility = Visibility.Visible; 
       ThumbTopRightCorner.Visibility = Visibility.Visible; 
       ThumbBottomLeftCorner.Visibility = Visibility.Visible; 
       ThumbBottomRightCorner.Visibility = Visibility.Visible; 
      } 
     } 
     #endregion 
    } 
} 
+0

Per quanto mi ricordo, esiste una proprietà Window.RestoreBounds che rappresenta esattamente la dimensione alla quale la finestra tornerà dopo la transizione allo stato normale – Demarsch

Problemi correlati