2013-02-10 52 views
4

我創建一個自定義的鍍鉻WPF窗口最大化邊界的窗口,所以我設置好的ResizeMode="NoResize"WindowStyle="None"實現我自己的鉻。但是,最大化無邊框窗口時會出現問題:需要整個屏幕。WPF - 通過採取在考慮了用戶任務欄

我發現下面的技巧來解決該問題的一部分: http://chiafong6799.wordpress.com/2009/02/05/maximizing-a-borderlessno-caption-window/

這成功地抑制了窗口大小從覆蓋任務欄,以防止。但是,如果用戶將他的任務欄定位在左側或頂部,則這將不起作用,因爲窗口位於位置0,0。

是否有任何方法可以更準確地檢索可用區域,或者查詢用戶任務欄的位置,以便相應地定位最大化的窗口?

回答

5

我身邊有一個快速播放和似乎設置WindowsLeftTop性能與一個無國界的形式設置WindowState.Maximized時被忽略。

一種解決方法是忽略WindowState功能和創建自己的Maximize/Restore功能

粗糙的例子。

public partial class MainWindow : Window 
{ 
    private Rect _restoreLocation; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void MaximizeWindow() 
    { 
     _restoreLocation = new Rect { Width = Width, Height = Height, X = Left, Y = Top }; 
     System.Windows.Forms.Screen currentScreen; 
     currentScreen = System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position); 
     Height = currentScreen.WorkingArea.Height; 
     Width = currentScreen.WorkingArea.Width; 
     Left = currentScreen.WorkingArea.X; 
     Top = currentScreen.WorkingArea.Y; 
    } 

    private void Restore() 
    { 
     Height = _restoreLocation.Height; 
     Width = _restoreLocation.Width; 
     Left = _restoreLocation.X; 
     Top = _restoreLocation.Y; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     MaximizeWindow(); 
    } 

    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     Restore(); 
    } 

    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      DragMove(); 
     } 
     base.OnMouseMove(e); 
    } 
} 

的XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="74.608" Width="171.708" ResizeMode="NoResize" WindowStyle="None"> 
    <Grid> 
     <Button Content="Max" HorizontalAlignment="Left" Margin="0,29,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 
     <Button Content="Restore" HorizontalAlignment="Left" Margin="80,29,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/> 
    </Grid> 
</Window> 

顯然,你會想清理這個代碼,但它似乎工作的任何地方Taskbar所在,然而,你可能需要添加一些邏輯,以獲得正確的LeftTop如果用戶字體DPI大於100%

+0

這正是我需要的,非常感謝! 在附註中,由於WindowState被忽略,所以還需要添加som邏輯以防止在最大化時調整大小。 由於我用隱藏的大拇指元素手動實現了大小調整,但這對我來說確實不是問題。 – Kaz 2013-02-11 00:50:22

2

另一種方法是處理WM_GETMINMAXINFO Win32消息。代碼here顯示瞭如何做到這一點。

注意,有幾件事情,我會做出不同的,如在WindowProc中返回IntPtr.Zero代替(System.IntPtr)0,使MONITOR_DEFAULTTONEAREST常數。但這只是編碼風格的改變,並不會影響最終結果。

此外請務必注意SourceInitialized事件期間WindowProc掛鉤的更新,而不是OnApplyTemplate。這是做這件事的好地方。如果您正在實現從Window派生的類,則另一個選項是覆蓋OnSourceInitialized以鉤住WindowProc而不是附加到事件。這正是我通常所做的。

相關問題