2012-12-04 13 views
7

Ana pencerenin kenarlığını kaldırabildiğim, ancak bu pencerenin yeniden boyutlandırılabildiği (kavrama olmadan) WPF'de bir yol var mı?Yeniden boyutlandırılabilen bir sınırsız WPF Penceresi nasıl oluşturulur?

Yeniden boyutlandırma modunu CanResizeWithGrip olarak ayarlayarak bu senaryoyu gerçekleştirmenin bir yolu olduğunu anladım. Bununla birlikte, CanResize olarak ayarlanan yeniden boyutlandırma modu ile bunu yapmak istiyorum.

aşağıdaki ayarlama çalıştı:

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

Ancak AllowsTransparency ayarlayarak, bu kavrama olmadan yeniden boyutlandırmak yeteneği kaldırır. Herhangi bir fikri nasıl çözebilirim?

Ayrıca, AllowsTransparency true olduğunda, penceremde bir winformshost denetimi kullanıyorum çünkü AllowsTransparency doğru olarak ayarlanamayacağımı unutmayın. Mevcut burada

+0

Sadece yerine benim UI yenilemek karar verdi ve sadece ResizeMode = "CanResize" kurmak ve inceliğini sınır bıraktı. – jsirr13

cevap

-5

en basit, ama belki de basit

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

Pencereyi taşımak istemiyorum, ancak sınır (ki sonunda gizlemek istediğim) sürüklendiğinde sadece yeniden boyutlandırmak istemiyorum. ESSentially Ben genellikle bir pencere yeniden boyutlandırma davranışını taklit etmek istiyorum, sadece gizlenmiş sınırla. – jsirr13

+0

Ardından, hareket ettiğiniz kenarı yakalamanız ve X, Y, W, H'yi kenarlara bağlı olarak ayarlamanız gerekir. – kenny

0
Sen WPF özelleştirilebilir pencere kütüphanesini kullanabilirsiniz

olduğunu: Kütüphanenin pencere türünü kullanırken http://wpfwindow.codeplex.com/ Sonra

, aynı ayarlayabilirsiniz yukarıda listelediğiniz özellikler

<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

Sitelerinde şunu söylüyor: WPF penceresinin tam olarak özelleştirilmesi, yalnızca AllowsTransparency değeri "True" olarak ayarlandığında yapılabilir. Yine de, AllowsTransparency değeri true olarak ayarlandığında, denetimin görüntülenmediği WinFormsHost hatası nedeniyle bunu kullanamıyorum. Belki bu sorunu aşabilirsem, cevabınız ideal çözüme yakın olacaktır. – jsirr13

+0

@ jsirr13, Denemedim, ama Win API aracılığıyla http://mrtncls.blogspot.com/2011/07/windowsformshost-on-transparent-wpf.html çözümü de nasıl çözüleceğine dair bir çözüm var. http: //www.neowin.net/forum/topic/646970-c% 23-wpf-window-ile-transparency-makes-windowsformshost-disappear/ –

+0

İkinci çözümü denedim, şans yok. Zamanım olduğunda ilk çözümü deneyeceğim. Geri dönüşünüz için teşekkür ederiz. – jsirr13

1

Kullanıcı, pencereyi yeniden boyutlandırmak için etkileşime girecek bir şeye ihtiyaç duyar. Varsayılan kenarlık veya tutmayı beğenmezseniz, pencereyi yeniden boyutlandıran bir tıklama ve sürükleme davranışıyla başka bir denetim eklemeniz gerekir. Belki de pencerenin her kenarındaki bir çizgi?

0

ResizeBorderThickness 0'a ayarlanırsa bu durum oluşabilir

Böyle XAML pozitif değere ayarlanabilir

:

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

Bu eski bir soru olduğunu biliyorum, ama sadece istedim yeni gelenler için çalışan bir örnek oluşturmak.

Xaml Penceresi: arkasında

<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# kodu:

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

Hatırladığım kadarıyla, pencerenin normal duruma geçtikten sonra geri döneceği büyüklüğü gösteren bir Window.RestoreBounds özelliği var. – Demarsch

İlgili konular