2010-07-23 137 views
8

我試圖做一個WPF窗口打開已經最大化,沒有調整大小/移動(在systemmenu,也不在邊界)。它應該始終最大化,除非用戶將其最小化。如何? WPF窗口 - 最大化,沒有調整大小/移動

我試圖把WindowState =「最大化」和ResizeMode =「CanMinimize」,但是當窗口打開時,它會覆蓋任務欄(我不需要它)。

我有一個WndProc的鉤子取消了SC_MOVE和SC_SIZE。 我也可以使用WndProc中的條件進行控制,如「如果命令是恢復並最小化,恢復,其他,塊」等。

但我的觀點是,如果我們有另一種方式來實現它。 Thankz for read guys =)

+0

這是在所有Windows應用程序框架中發現的常見問題。 App框架非常棒,它們讓我們能夠非常快速地編寫應用程序。問題在於它們無法涵蓋所有​​可能的場景,因爲它們的目的是隱藏底層系統的細節,當我們發現需要非標準的行爲時,我們需要挖掘並編寫「醜陋」的代碼。 – Tergiver 2010-07-23 13:46:50

+0

你想要一個窗口只能被最大化或最小化,而不能調整大小/移動的正常狀態?但不是全屏? – 2010-07-23 16:33:34

+0

@John Gardner,這正是我想要的。 – 2010-07-23 21:22:43

回答

1

正如Tergiver指出的,這是不可能的純粹的WPF方式。你必須使用P/Invoke。至於爲什麼窗口在打開時覆蓋任務欄,我認爲你通過取消SC_MOVE和SC_SIZE來搞亂一些必需的調用。也許你應該在加載窗口後取消這些調用。

+0

PInvoke ????? 在窗口構造函數中如何呢? //防止窗口重疊任務欄 this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth; – Califf 2013-02-11 21:23:24

2
public Window1() 
    { 
     InitializeComponent(); 

      this.SourceInitialized += Window1_SourceInitialized; 
    } 

    private void Window1_SourceInitialized(object sender, EventArgs e) 
    { 
     WindowInteropHelper helper = new WindowInteropHelper(this); 
     HwndSource source = HwndSource.FromHwnd(helper.Handle); 
     source.AddHook(WndProc); 
    } 

    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_MOVE = 0xF010; 

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 

     switch (msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = wParam.ToInt32() & 0xfff0; 
       if (command == SC_MOVE) 
       { 
        handled = true; 
       } 
       break; 
      default: 
       break; 
     } 
     return IntPtr.Zero; 
    } 
+2

此代碼將防止窗口被移動或最大化。如果使用SC_SIZE,它允許窗口被最大化和最小化,但不能調整大小。 const int SC_SIZE = 0xF000;在我的窗口xaml中,我使用WindowState =「Minimized」和ResizeMode =「CanResize」 – 2015-01-07 22:29:49

12

這是必要的,你的窗口的XAML來寫WindowState="Maximized" ResizeMode="NoResize"

<Window x:Class="Miscellaneous.EditForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Edit Form" WindowState="Maximized" ResizeMode="NoResize"></Window> 
+0

設置WindowState =「Maximized」與SplashScreen功能不兼容(您的主窗口將隱藏啓動畫面)。如果你沒有開始最大化,那麼ResizeMode =「NoResize」將阻止窗口最大化。 – 2015-01-07 22:08:07

0
WindowState="Maximized" 
ResizeMode="NoResize" 
WindowStyle="None" 

WindowStyle = 「無」 做你想做的,但是......你失去的窗口標題,關閉按鈕,並有其他問題。

訪問WindowStyle="None" some problems