2015-05-20 102 views
0

我有自定義窗口WindowState=WindowState.Maximized與邊框和拇指內邊框,似乎當我無法拖動和自定義窗口移動到不同的屏幕時WindowState=WindowState.MaximizedWPF拇指拖動和WindowState.Maximized移動

的XAML:

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="350" 
     Width="525" 
     WindowStyle="None"> 
     <Border Name="headerBorder" 
      Width="Auto" 
      Height="50" 
      VerticalAlignment="Top" 
      CornerRadius="5,5,0,0" 
      DockPanel.Dock="Top" 
      Background="Red" 
      BorderThickness="1,1,1,1" 
      BorderBrush="Yellow"> 
      <Grid x:Name="PART_Title"> 
       <Thumb x:Name="headerThumb" 
        Opacity="0" 
        Background="{x:Null}" 
        Foreground="{x:Null}" 
        DragDelta="headerThumb_DragDelta"/> 
      </Grid> 
     </Border> 
    </Window> 

C#:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     WindowState = System.Windows.WindowState.Maximized; 
    } 

    private void headerThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
    { 
     Left = Left + e.HorizontalChange; 
     Top = Top + e.VerticalChange; 
    } 
} 

我也覆蓋MouseLeftButtonDown方法和使用DragMove()內,但沒有成功。我也嘗試訂閱拇指的MouseLeftButtonDown並在那裏寫入DragMove()但沒有成功。

+1

你嘗試使用[WindowChrome](https://msdn.microsoft.com/en-us/ library/system.windows.shell.windowchrome%28v = vs.110%29.aspx)在.NET 4.5中?它允許你有一個沒有任何樣式和邊框的窗口,並且能夠像經典窗口一樣操作它(甚至在WindowState Maximized中)。 – Max

回答

1

默認情況下,最大化窗口不能移動,因此LeftTop不起作用。一種選擇是註冊Thumb.DragStarted事件並檢查窗口是否最大化。如果是,您可以設置WindowState.Normal並相繼更新LeftTop屬性。

在代碼中,這看起來有點像這樣:

private void Thumb_OnDragStarted(object sender, DragStartedEventArgs e) 
{ 
    // If the window is not maximized, do nothing 
    if (WindowState != WindowState.Maximized) 
     return; 

    // Set window state to normal 
    WindowState = WindowState.Normal; 

    // Here you have to determine the initial Left and Top values 
    // for the window that has WindowState normal 
    // I would use something like the native 'GetCursorPos' (in user32.dll) 
    // function to get the absolute mouse point on all screens 
    var point = new Win32Point(); 
    GetCursorPos(ref point); 
    Left = point - certainXValue; 
    Top = point - certainYValue; 

} 

您可以瞭解更多關於GetCursorPoshere

但是,我強烈建議您使用.NET 4.5附帶的WindowChrome類,Max在評論中也提到了這個類。你只需要使用下面的代碼,你有你要求的功能:

<Window x:Class="ThumbMaximizedWindow.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" 
     Width="525" 
     WindowStyle="None" 
     WindowState="Maximized"> 
    <WindowChrome.WindowChrome> 
     <WindowChrome /> 
    </WindowChrome.WindowChrome> 

</Window> 
+0

確實。您可以通過設置[CaptionHeight](https://msdn.microsoft.com/en-us/library/system.windows.shell.windowchrome.captionheight%28v=vs.110%29.aspx)來設置拇指的大小)'WindowChrome'的屬性。 [CornerRadius](https://msdn.microsoft.com/en-us/library/system.windows.shell.windowchrome.cornerradius%28v=vs.110%29.aspx)和[ResizeBorderThickness](https:// msdn .microsoft.com/en-us/library/system.windows.shell.windowchrome.resizeborderthickness%28v = vs.110%29.aspx)也很有趣。 – Max

+0

謝謝!它幫助到我。 –

+0

我看到該應用程序有奇怪的行爲,我有2個顯示器,當應用程序處於最大化模式並拖動到第二個顯示器以最大化模式時,默認窗口按鈕是apprears ..其已知問題? –