2012-11-16 25 views
7

मैं XAML में निम्नलिखित खिड़की गुण सेट करके सीमारहित WPF खिड़की बना लिया है:WPF सीमा विंडो मुद्दों: एयरो स्नैप और अधिकतम

:

... WindowStyle="None" AllowsTransparency="True" ... 

यह कई मुद्दों का कारण बनता है 1) हल किया गया: इसमें अब कोई अंतर्निहित आकार बदलने की कार्यक्षमता नहीं है

2) हल किया गया: अब इसमें कोई भी bu नहीं है ILT में खींचें कार्यक्षमता

3) हल: शीर्ष टूलबार के बिना, यह नहीं रह गया है कम से कम है/अधिकतम/बहाल/बंद बटन

4) हल: हवाई तस्वीर के माध्यम से अधिकतम या WindowState रोकता है की स्थापना यह अपहरण से।

5) एरो स्नैप या विंडोस्टेट सेटिंग के माध्यम से अधिकतम करने से विंडो स्क्रीनबार को ओवरलैप करने पर सीमा के रूप में पूरी स्क्रीन का उपयोग किया जाएगा।

6) एरो स्नैप या विंडोस्टेट सेटिंग के माध्यम से अधिकतम करने में एक -7 मार्जिन शामिल है, जिसमें खिड़की के किनारों से परे प्रत्येक तरफ खिड़की 7 पिक्सल शामिल है।

1-3 को xaml विंडो टेम्पलेट बनाकर हल किया गया था। मैंने अदृश्य आयताकारों को हैंडल क्षेत्रों के रूप में उपयोग किया, और इसके पीछे कुछ कोड उपयोगकर्ता 32.dll SendMessage (...) के माध्यम से कार्यक्षमता संलग्न करने के लिए OnApplyTemplate() को ओवरराइड करने के माध्यम से लागू किया गया था/स्थानांतरित/न्यूनतम/अधिकतम/पुनर्स्थापित/बंद/बंद करने के लिए।

मैं # 4 here

मैं WndProc के माध्यम से अधिकतम संदेश में अवरोध उत्पन्न और मैन्युअल रूप से आकार/स्थिति निर्धारित करके 5-6 को सुलझाने की कोशिश की करने के लिए इस सवाल का जवाब मिल गया है, लेकिन इस अधिकतम आकार के RestoreRegion अधिलेखन के मुद्दे था/स्थिति, खिड़की को बहाल करने की क्षमता को हटा रहा है।

वास्तव में क्या अजीब बात यह है कि स्क्रीन के शीर्ष पर शीर्ष सीमा से खिड़की का आकार बदलना एरो पूर्ण ऊंचाई स्नैप को ठीक करता है, बिल्कुल कोई समस्या नहीं है।

तो, मैं एक लंबा सफर तय कर चुका हूं, लेकिन 5-6 अभी भी एक मुद्दा है ... क्या अधिकतम क्षेत्र को मैन्युअल रूप से निर्दिष्ट करने का कोई तरीका है? या, पुनर्स्थापना संपत्ति को प्रभावित किए बिना विंडो आकार सेट करने का कोई तरीका है?

+0

यह अच्छा होगा यदि आप एक जवाब में अपने समाधान 1-4 जोड़ने .. – CularBytes

+0

सेकेंड किया गया, मुझे # 4 – mgarant

उत्तर

1
इन सभी समस्याओं के लिए

, मैं केवल यह सिफारिश कर सकते हैं:

MahApps.Metro: http://mahapps.com/MahApps.Metro/

Sourcecode: https://github.com/MahApps/MahApps.Metro

यह एक अच्छा विषय और प्रयोग करने में आसान के साथ एक अच्छा पुस्तकालय है!

आशा में मदद करता है कि

+0

का जवाब देना बहुत पसंद है मेरे पास नहीं है अभी समय है, लेकिन जब मुझे मौका मिलता है तो मैं स्रोत कोड को देखूंगा। आपके जवाब के लिए धन्यवाद। – Chronicide

2

आप WM_GETMINMAXINFO Win32 संदेश से निपटने के द्वारा अधिकतम क्षेत्र निर्दिष्ट कर सकते हैं। कोड here दिखाता है कि यह कैसे करें। यह मुद्दों # 5 और # 6 हल करेगा।

ध्यान दें कि कुछ चीजें हैं जो मैं अलग-अलग करूँगा, जैसे विंडोप्रोक में (System.IntPtr) 0 के बजाय IntPtr.Zero लौटाना और MONITOR_DEFAULTTONEAREST स्थिर बनाना। लेकिन यह सिर्फ कोडिंग शैली में बदलाव है, और नेट परिणाम को प्रभावित नहीं करता है।

यह भी सुनिश्चित करें कि WindowProcOnApplyTemplate के बजाय SourceInitialized ईवेंट के दौरान लगाए गए अद्यतन पर ध्यान देना सुनिश्चित करें। यह करने के लिए यह बेहतर जगह है। यदि आप विंडो से व्युत्पन्न कक्षा को कार्यान्वित कर रहे हैं, तो दूसरा विकल्प OnSourceInitialized को ईवेंट से जोड़ने के बजाय WindowProc को हुक करने के लिए ओवरराइड करना है। मैं सामान्य रूप से यही करता हूं।

3

प्वाइंट नंबर 5 के लिए, इस का उपयोग करें:

public WindowName() // Constructor for your window 
{ 
this.MaxHeight = SystemParameters.WorkArea.Height; 
this.MaxWidth = SystemParameters.WorkArea.Width; 
} 

यह सुनिश्चित होगा कि खिड़की टास्कबार विस्तृत होने पर ओवरलैप नहीं करेंगे।

+2

यह केवल तभी काम करता है जब (ए) आपके पास केवल एक मॉनिटर है, और (बी) टास्कबार आपके मॉनिटर के निचले किनारे पर है। कोई अन्य विन्यास और यह विफल रहता है। –

5

सबसे आसान पूर्ण समाधान

नमस्कार, निम्न समाधान मुद्दों सरल तरीके से अपने प्रश्न में दिए गए विवरण के सभी ठीक करता है, और WPF और सी # भाषा के नवीनतम संस्करण का उपयोग कर Windows 10 पर काम करता है और .NET ढांचे। यह 3/15/2017 के रूप में है। अगर यह काम करना बंद कर देता है तो कृपया मुझे बताएं।

चरण 1: मुद्दों 1, 2 से निपटने के लिए और 4, आपके आवेदन की XAML में अपने <Window ... > </Window> टैग के भीतर, इस में पेस्ट, ऊपर या नीचे पर:

<WindowChrome.WindowChrome> 
    <WindowChrome CaptionHeight="35"/> 
<WindowChrome.WindowChrome> 

CaptionHeight है अपनी खिड़की खींचने की क्षेत्र की वांछित ऊंचाई।

चरण 2: समस्या 3 को हल करने के लिए, आपको अपनी शीर्षक पट्टी और कैप्शन के साथ-साथ विंडो नियंत्रण भी बनाना होगा। ऐसा करने के लिए, आपको बस वांछित शीर्षक पट्टी तत्वों को शीर्ष के वर्टिकल एलाइनमेंट देने की आवश्यकता है, या उन्हें शीर्ष पर वर्टिकल एलाइनमेंट सेट के साथ ग्रिड में डालना होगा, जो उन सभी के लिए यह करेगा, लेकिन सुनिश्चित करें कि उनकी ऊंचाई नहीं है CaptionHeight से अधिक WindowChrome तत्व पर XAML में चरण 1 से घोषित किया गया है। सभी बटनों के लिए, आपको उन्हें, या उनके कंटेनर, संपत्ति WindowChrome.IsHitTestVisibleInChrome="True" असाइन करना होगा। यहाँ एक उदाहरण है: खिड़की नियंत्रण बटन के लिए उचित कार्यक्षमता जोड़ने के लिए, अपने codebehind की MainWindow() निर्माता के भीतर अब

<Grid VerticalAlignment="Top" Background="White" Name="TitleBar" Height="35"> 
    <Label Content="Borderless Window Test" VerticalAlignment="Center" HorizontalAlignment="Left"/> 
    <StackPanel WindowChrome.IsHitTestVisibleInChrome="True" VerticalAlignment="Center" HorizontalAlignment="Right" Orientation="Horizontal" Name="WindowControls"> 
     <Button Height="35" Width="35" Content="-" Padding="0" Name="MinimizeButton"/> 
     <Button Height="35" Width="35" Content="+" Padding="0" Name="MaximizeButton"/> 
     <Button Height="35" Width="35" Content="x" Padding="0" Name="CloseButton"/> 
    </StackPanel> 
</Grid> 

, आपके आवेदन की सी # स्रोत कोड, कॉल के बाद पेस्ट में निम्नलिखित, InitializeComponent(); रहे हैं:

CloseButton.Click += (s, e) => Close(); 
MaximizeButton.Click += (s, e) => WindowState = WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal; 
MinimizeButton.Click += (s, e) => WindowState = WindowState.Minimized; 

चरण 3: मुद्दों के समाधान के लिए 5 और 6, आप WmGetMinMaxInfo में हुक करने की जरूरत है। ऐसा करने के लिए, अपने कोडबेंड पर जाएं, फिर अपनी विंडो कक्षा में Pastebin से सबकुछ कॉपी और पेस्ट करें।अब, अपने MainWindow() निर्माता, पेस्ट के भीतर:

System.Management 
System.Windows.Interop 
System.Security.Principal 
System.Runtime.InteropServices 
Microsoft.Win32 

जाँच करने के लिए सबसे अच्छा तरीका में Assemblies टैब पर क्लिक करने के लिए है:

SourceInitialized += (s, e) => 
{ 
    IntPtr handle = (new WindowInteropHelper(this)).Handle; 
    HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(WindowProc)); 
}; 

फ़ाइल मेनू में Project > Add References के माध्यम से, के लिए संदर्भ के लिए सुनिश्चित हो ऊपरी बाएं, फिर Framework का चयन करें, फिर विंडो के ऊपरी दाएं कोने में स्थित खोज बॉक्स का उपयोग करें। अब इन सभी उपयोगों (नामस्थान) को अपने कोडबेइंड के शीर्ष पर जोड़ें:

using System.Management; 
using System.Windows.Interop; 
using System.Security.Principal; 
using System.Runtime.InteropServices; 
using Microsoft.Win32; 

इसमें सबकुछ शामिल होना चाहिए। आशा है कि ये आपकी मदद करेगा!

+0

जबकि मैं व्यक्तिगत रूप से मानता हूं कि 'Microsoft.Win32' के संदर्भ से बचा जाना चाहिए (पोर्टेबिलिटी कारणों के लिए, यदि कुछ और नहीं है), तो मैं इस उत्तर की सराहना करता हूं। मुझे 'विंडो क्रोम' के बारे में पता था, लेकिन केवल आपकी पोस्ट ने मुझे एहसास दिलाया कि मैंने सोचा जितना आसान था। – Informagic

+0

विभिन्न रिज़ॉल्यूशन सेटिंग के साथ एक बहु मॉनिटर में पूरी तरह से सही नहीं है, लेकिन अब तक बेहतर समाधान मिला है! मुझे विशेष रूप से विंडो क्रोम सामान पसंद आया – Bruno

0

मैं बस इस पूरी चीज से खुद चला गया। यह एक असली कोर था, क्योंकि आपको मैन्युअल रूप से इतना खाता है। यह मजाकिया है, हम इन दिनों के लिए बहुत कुछ लेते हैं, कुछ सरल खिड़की कैसे काम करता है। लेकिन इस नमूना कोड पर एक नज़र जो मैं प्रदान कर रहा हूं, यह एक अच्छा संकेत है कि इस समस्या में वास्तव में कितना वास्तव में जाता है।

मुझे आशा है कि इससे मदद मिलेगी, क्योंकि मुझे यहां आने के लिए थोड़ा समय लगा।

MainWindow.Xaml

<Window x:Class="WpfApp1.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:WpfApp1" 
    Background="Transparent" 
    WindowStartupLocation="CenterScreen" 
    ResizeMode="CanResizeWithGrip" 
    AllowsTransparency="True" 
    WindowStyle="None" 
    mc:Ignorable="d" 
    Title="Test Window Behavior" Height="768" Width="1024" StateChanged="Window_StateChanged" PreviewMouseLeftButtonDown="Window_PreviewMouseLeftButtonDown"> 

<Grid> 
    <DockPanel Grid.Column="1" Grid.Row="1"> 
     <DockPanel x:Name="titleBar" Background="White" DockPanel.Dock="Top"> 
      <Rectangle Width="32" Height="32" DockPanel.Dock="Left" Fill="Red" Margin="2"/> 
      <StackPanel Orientation="Horizontal" DockPanel.Dock="Right" Margin="2"> 

       <!-- Minimize Button --> 
       <Border Width="24" Height="24" Margin="2" HorizontalAlignment="Right" MouseLeftButtonUp="OnMinimizeWindow" Grid.Column="2"> 
        <Border.Style> 
         <Style TargetType="Border"> 
          <Setter Property="Background" Value="Transparent" /> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="Background" Value="#FFD0D0D0" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <TextBlock FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" Text="0" FontFamily="Webdings" /> 
       </Border> 

       <!-- Maximize Button --> 
       <Border Width="24" Height="24" Margin="2" HorizontalAlignment="Right" MouseLeftButtonUp="OnMaximizeWindow" Grid.Column="3"> 
        <Border.Style> 
         <Style TargetType="Border"> 
          <Setter Property="Background" Value="Transparent" /> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="Background" Value="#FFD0D0D0" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <TextBlock x:Name="IsMaximized" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Webdings"> 
         <TextBlock.Style> 
          <Style TargetType="TextBlock"> 
           <Setter Property="Text" Value="1" /> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding Path=InternalWindowState, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="Maximized"> 
             <Setter Property="Text" Value="2" /> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </TextBlock.Style> 
        </TextBlock> 
       </Border> 

       <!-- Close Button --> 
       <Border Width="24" Height="24" Margin="2" HorizontalAlignment="Right" MouseLeftButtonUp="OnCloseWindow" Grid.Column="4"> 
        <Border.Style> 
         <Style TargetType="Border"> 
          <Setter Property="Background" Value="Transparent" /> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="Background" Value="Red" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <TextBlock FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" Text="r" FontFamily="Webdings" /> 
       </Border> 
      </StackPanel> 

      <Label MouseLeftButtonDown="OnDragMoveWindow" MouseDoubleClick="OnMaximizeWindow" Margin="8 0 0 0" FontSize="12" VerticalContentAlignment="Center" Content="{Binding Path=Title, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, FallbackValue='Main Window'}" /> 
     </DockPanel> 

     <Grid Background="White" DockPanel.Dock="Bottom" Height="32"> 
      <Label VerticalContentAlignment="Center" Content="Statusbar Text Goes Here ..." /> 
     </Grid> 

     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100" /> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="100" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="100" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="100" /> 
      </Grid.RowDefinitions> 

      <!-- Top 3 --> 
      <Border Background="Gray" Grid.Row="0" Grid.Column="0" /> 
      <Border Background="Gray" Grid.Row="0" Grid.Column="1" BorderBrush="Black" BorderThickness="0 0 0 1" /> 
      <Border Background="Gray" Grid.Row="0" Grid.Column="2" /> 

      <!-- Middle 2 --> 
      <Border Background="Gray" Grid.Row="1" Grid.Column="0" BorderBrush="Black" BorderThickness="0 0 1 0" /> 
      <Border Background="Gray" Grid.Row="1" Grid.Column="2" BorderBrush="Black" BorderThickness="1 0 0 0" /> 

      <!-- Bottom 3 --> 
      <Border Background="Gray" Grid.Row="2" Grid.Column="0" /> 
      <Border Background="Gray" Grid.Row="2" Grid.Column="1" BorderBrush="Black" BorderThickness="0 1 0 0" /> 
      <Border Background="Gray" Grid.Row="2" Grid.Column="2" /> 
     </Grid> 
    </DockPanel> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="Thumb"> 
       <Style.Setters> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Border Background="Transparent" /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style.Setters> 
      </Style> 
     </Grid.Resources> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="25" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="25" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="25" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="25" /> 
     </Grid.RowDefinitions> 

     <!-- Top/Left --> 
     <DockPanel LastChildFill="False" Grid.Row="0" Grid.Column="0"> 
      <Thumb DockPanel.Dock="Left" Width="4" Cursor="SizeNWSE" Tag="0" DragDelta="Thumb_DragDelta" /> 
      <Thumb DockPanel.Dock="Top" Height="4" Cursor="SizeNWSE" Tag="0" DragDelta="Thumb_DragDelta" /> 
     </DockPanel> 

     <!-- Top/Right --> 
     <DockPanel LastChildFill="False" Grid.Row="0" Grid.Column="2"> 
      <Thumb DockPanel.Dock="Right" Width="4" Cursor="SizeNESW" Tag="0" DragDelta="Thumb_DragDelta" /> 
      <Thumb DockPanel.Dock="Top" Height="4" Cursor="SizeNESW" Tag="0" DragDelta="Thumb_DragDelta" /> 
     </DockPanel> 

     <!-- Bottom/Left --> 
     <DockPanel LastChildFill="False" Grid.Row="2" Grid.Column="0"> 
      <Thumb DockPanel.Dock="Left" Width="4" Cursor="SizeNESW" Tag="1" DragDelta="Thumb_DragDelta" /> 
      <Thumb DockPanel.Dock="Bottom" Height="4" Cursor="SizeNESW" Tag="1" DragDelta="Thumb_DragDelta" /> 
     </DockPanel> 

     <!-- Bottom/Right --> 
     <DockPanel LastChildFill="False" Grid.Row="2" Grid.Column="2"> 
      <Thumb DockPanel.Dock="Right" Width="4" Cursor="SizeNWSE" Tag="1" DragDelta="Thumb_DragDelta" /> 
      <Thumb DockPanel.Dock="Bottom" Height="4" Cursor="SizeNWSE" Tag="1" DragDelta="Thumb_DragDelta" /> 
     </DockPanel> 

     <!-- Left --> 
     <Thumb Grid.Row="1" Grid.Column="0" Width="4" Cursor="SizeWE" Tag="0" HorizontalAlignment="Left" DragDelta="Thumb_DragDelta" /> 

     <!-- Top --> 
     <Thumb Grid.Row="0" Grid.Column="1" Height="4" Cursor="SizeNS" Tag="0" VerticalAlignment="Top" DragDelta="Thumb_DragDelta" /> 

     <!-- Right --> 
     <Thumb Grid.Row="1" Grid.Column="2" Width="4" Cursor="SizeWE" Tag="1" HorizontalAlignment="Right" DragDelta="Thumb_DragDelta" /> 

     <!-- Bottom --> 
     <Thumb Grid.Row="2" Grid.Column="1" Height="4" Cursor="SizeNS" Tag="1" VerticalAlignment="Bottom" DragDelta="Thumb_DragDelta" /> 
    </Grid> 
</Grid> 

MainWindow.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Controls.Primitives; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApp1 
{ 
    public partial class MainWindow : Window 
    { 
     #region --- Declarations --- 
     private Rect _location { get; set; } 
     #endregion 

     #region --- Constructors --- 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
     #endregion 

     #region --- Properties --- 
     private Rect DesktopArea 
     { 
      get 
      { 
       var c = System.Windows.Forms.Cursor.Position; 
       var s = System.Windows.Forms.Screen.FromPoint(c); 
       var a = s.WorkingArea; 
       return new Rect(a.Left, a.Top, a.Width, a.Height); 
      } 
     } 
     #endregion 

     #region --- Dependency Properties --- 
     public static readonly DependencyProperty InternalWindowStateProperty = DependencyProperty.Register("InternalWindowState", typeof(WindowState), typeof(MainWindow), new PropertyMetadata(WindowState.Normal, new PropertyChangedCallback(OnInternalWindowStateChanged))); 

     public WindowState InternalWindowState 
     { 
      get { return (WindowState)GetValue(InternalWindowStateProperty); } 
      set { SetValue(InternalWindowStateProperty, value); } 
     } 

     private static void OnInternalWindowStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      MainWindow instance = (MainWindow)d; 
      instance.SetInternalWindowState((WindowState)e.NewValue); 
     } 
     #endregion 

     #region --- Private Methods --- 
     private void StoreLocation() 
     { 
      _location = new Rect(this.Left, this.Top, this.Width, this.Height); 
     } 

     private void RestoreLocation() 
     { 
      this.Width = _location.Width; 
      this.Height = _location.Height; 
      this.Top = _location.Top >= 0 ? _location.Top : 0; 
      this.Left = _location.Left; 
     } 

     private void SetMaximizedState() 
     { 
      this.Width = DesktopArea.Width; 
      this.Height = DesktopArea.Height; 
      this.Top = DesktopArea.Top; 
      this.Left = DesktopArea.Left; 
     } 

     private void SetInternalWindowState(WindowState state) 
     { 
      InternalWindowState = state; 

      switch (InternalWindowState) 
      { 
       case WindowState.Normal: 
        this.WindowState = WindowState.Normal; 
        RestoreLocation(); 
        break; 
       case WindowState.Maximized: 
        this.WindowState = WindowState.Normal; 
        SetMaximizedState(); 
        break; 
       case WindowState.Minimized: 
        this.WindowState = WindowState.Minimized; 
        break; 
      } 
     } 
     #endregion 

     #region --- Sizing Routines --- 
     private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
     { 
      Thumb thumb = (Thumb)sender; 
      int tag = Convert.ToInt32(thumb.Tag); 
      if (thumb.Cursor == Cursors.SizeWE) HandleSizeWE(tag, e); 
      if (thumb.Cursor == Cursors.SizeNS) HandleSizeNS(tag, e); 
      if (thumb.Cursor == Cursors.SizeNESW) HandleSizeNESW(tag, e); 
      if (thumb.Cursor == Cursors.SizeNWSE) HandleSizeNWSE(tag, e); 
     } 

     private void HandleSizeNWSE(int tag, DragDeltaEventArgs e) 
     { 
      if (tag == 0) 
      { 
       this.Top += e.VerticalChange; 
       this.Height -= e.VerticalChange; 
       this.Left += e.HorizontalChange; 
       this.Width -= e.HorizontalChange; 
      } 
      else 
      { 
       this.Width += e.HorizontalChange; 
       this.Height += e.VerticalChange; 
      } 
     } 

     private void HandleSizeNESW(int tag, DragDeltaEventArgs e) 
     { 
      if (tag == 0) 
      { 
       this.Top += e.VerticalChange; 
       this.Height -= e.VerticalChange; 
       this.Width += e.HorizontalChange; 
      } 
      else 
      { 
       this.Left += e.HorizontalChange; 
       this.Width -= e.HorizontalChange; 
       this.Height += e.VerticalChange; 
      } 
     } 

     private void HandleSizeNS(int tag, DragDeltaEventArgs e) 
     { 
      if (tag == 0) 
      { 
       this.Top += e.VerticalChange; 
       this.Height -= e.VerticalChange; 
      } 
      else 
       this.Height += e.VerticalChange; 
     } 

     private void HandleSizeWE(int tag, DragDeltaEventArgs e) 
     { 
      if (tag == 0) 
      { 
       this.Left += e.HorizontalChange; 
       this.Width -= e.HorizontalChange; 
      } 
      else 
       this.Width += e.HorizontalChange; 
     } 
     #endregion 

     #region --- Event Handlers --- 
     private void OnDragMoveWindow(Object sender, MouseButtonEventArgs e) 
     { 
      if (this.InternalWindowState == WindowState.Maximized) 
      { 
       var c = System.Windows.Forms.Cursor.Position; 
       this.InternalWindowState = WindowState.Normal; 
       this.Height = _location.Height; 
       this.Width = _location.Width; 
       this.Top = c.Y - (titleBar.ActualHeight/2); 
       this.Left = c.X - (_location.Width/2); 
      } 
      this.DragMove(); 
     } 

     private void OnMaximizeWindow(Object sender, MouseButtonEventArgs e) 
     { 
      if (this.InternalWindowState == WindowState.Maximized) 
       this.InternalWindowState = WindowState.Normal; 
      else 
       this.InternalWindowState = WindowState.Maximized; 
     } 

     private void OnMinimizeWindow(Object sender, MouseButtonEventArgs e) 
     { 
      this.InternalWindowState = WindowState.Minimized; 
     } 

     private void OnCloseWindow(Object sender, MouseButtonEventArgs e) 
     { 
      Application.Current.Shutdown(); 
     } 

     private void Window_StateChanged(object sender, EventArgs e) 
     { 
      if (this.WindowState == WindowState.Maximized) 
      { 
       this.InternalWindowState = WindowState.Maximized; 
      } 
     } 

     private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      if (this.InternalWindowState != WindowState.Maximized) 
       StoreLocation(); 
     } 
     #endregion 
    } 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^