2009-09-23 85 views
17

我希望達到與基於Windows Media Player或基於瀏覽器的Flash播放器相同的效果,這些播放器在最大化時佔用整個(甚至不是任務欄可見)實際佔用的空間。WPF窗口樣式=無覆蓋任務欄當應用程序初始化時最大化

如果WindowState設置爲Maximized等應用程序在該國開始WindowStyle設置爲None在XAML這工作得很好。問題是我想在邊框窗口中啓動應用程序,當用戶選擇時,按照上面的指定最大化。在StateChanged處理程序中,我檢查Maximized狀態,如果是這種情況,我將WindowStyle設置爲None。這具有最大化窗口但不覆蓋任務欄的效果。下面的代碼將完成這項工作,因爲我想但其背,我想清理:

if (WindowState == WindowState.Maximized) 
{ 
    m_videoWindow.Maximize(); 

    WindowStyle = WindowStyle.None; 

    //the following makes this work but I would like to clean it up 
    Hide(); 
    Show(); 
} 

編輯This(從2006年時仍處於CTP)提到從MS問題,有人他們希望在下一個版本中改進全屏支持,是否進行了這些改進?

+0

這個問題仍然活着,並與WPF/.NET 4.0的所有最新版本... - 我想微軟希望這個錯誤是向後兼容的...你的隱藏/顯示修復工程很好,但...我在做我的一點不同,調用隱藏,設置屬性,然後調用Show。 – BrainSlugs83 2011-09-18 08:56:54

+0

那該死的。我注意到我的一些控件沒有正確調整大小,不知道爲什麼(無論是我的訂單還是訂單...);快速解決方案是最大化,調用DoEvents(),將WindowStyle設置爲None,然後調用Hide&Show。 - DoEvents當然是System.Windows.Forms.Application.DoEvents()(是的,我知道這是瘋了,也許是最壞的做法,但它的工作原理......) – BrainSlugs83 2011-09-18 09:47:36

回答

13

本文解釋了這一切:Maximizing window (with WindowStyle=None) considering Taskbar

也值得一試:Custom Window Chrome in WPF

編輯:現在新的,是WPF外殼集成庫,使窗口鑲邊的完整restyle沒有重新實現移動,調整大小的頭痛等

編輯2015年:外殼集成庫現在是集成在WPF和MS中退役代碼

+0

謝謝愛德華多。我曾讀過,但希望有一個不需要Win32的解決方案。我相信肯定有東西,因爲我上面提到的破解工作.... – 2009-12-22 20:10:27

+0

我想沒有,因爲行爲是由設計,所以你可以有一個窗口,需要所有的桌面,如BabySmash。 – 2009-12-22 21:34:22

+1

是不是很奇怪,但最初加載窗口WindowStyle = None和WindowState = Maximized時,任務欄被遮擋,但在加載後最大化窗口時不是這種情況? – 2009-12-22 22:18:19

1

我不知道這對你是否合適,但你可以調整窗口的大小,使其具有與工作區相同的大小(即在大多數情況下,所有屏幕除了任務欄)並將其定位在0,0(左上角):

Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; 
Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; 
Left = 0; 
Top = 0; 

爲(從MSDN)的WorkingArea屬性的精確定義是:

獲取所述顯示器的工作區域。工作區域是顯示器的桌面區域,不包括任務欄,停靠窗口和停靠工具欄。

希望它可以幫助

+0

如果任務欄位於頂部,該怎麼辦?或者你有多個顯示器? – 2010-03-04 10:05:09

+0

在這種情況下,這將無法按預期工作。 – Fix 2010-10-27 14:21:09

+0

是的,我有同樣的想法,但也提出了相同的反對意見。可惜這不是簡單的查詢應用程序在哪個監視器上,並獲得該監視器的確切RECT ......可能有一些interop調用來做到這一點,但擰... – BrainSlugs83 2011-09-18 09:50:34

2

爲了得到這個在我的WPF/.NET 4.0的應用程序正常工作,我調用這個函數,每當我進入或退出全屏模式:

private static void RefreshWindowVisibility(Window window) 
     { 
      if (window.OriginalWindowState == WindowState.Maximized) 
      { 
       window.Hide(); 
       window.Show(); 
       window.BringIntoView(); 
      } 
     } 

有一個閃爍與此方法相關聯,但在Chrome上進入全屏模式時,似乎存在相同的閃爍。 Internet Explorer似乎採取了不同的方法。

2

我發現我可以在創建窗口(在xaml中)時通過設置屬性最大化爲全屏(覆蓋任務欄),但無法在創建後來回切換。一些試驗後,我發現屬性的設置順序似乎無關緊要:

public bool IsFullscreen 
{ 
    get 
    { 
     return WindowState == System.Windows.WindowState.Maximized 
      && ResizeMode == System.Windows.ResizeMode.NoResize 
      && WindowStyle== System.Windows.WindowStyle.None; 
    } 
    set 
    { 
     if (value) 
     { 
      ResizeMode = System.Windows.ResizeMode.NoResize; 
      WindowStyle = System.Windows.WindowStyle.None; 
      WindowState = System.Windows.WindowState.Maximized; 
     } 
     else 
     { 
      ResizeMode = System.Windows.ResizeMode.CanResize; 
      WindowStyle = System.Windows.WindowStyle.SingleBorderWindow; 
      WindowState = System.Windows.WindowState.Normal;    
     } 
    } 
} 

注意的WindowState在二傳手最後出現

相關問題