2014-01-22 52 views
8

我在Windows 8.1上使用自己的樣式WPF窗口時遇到了一些問題。我寫了一個簡單透明的WPF窗口與WindowChrome默認窗口拖動行爲:在Windows 8.1上使用WindowChrome時,任務欄圖標消失

<Window x:Class="WpfApplication1.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="300" Width="300" Background="Transparent" 
     AllowsTransparency="True" WindowStyle="None"> 
    <WindowChrome.WindowChrome> 
     <WindowChrome /> 
    </WindowChrome.WindowChrome> 
    <Border Background="Gray" CornerRadius="20"> 
     <Grid> 
     </Grid> 
    </Border> 
</Window> 

的Windows 8.1設置:

  • 2臺顯示器與桌面擴展
  • 任務欄只有小學桌面
上可見

報告代碼:

  1. 開始WPF應用程序
  2. 移動窗口輔助屏幕
  3. 上(由在頂部對接窗口例如)
  4. 還原和從輔助屏幕拖動窗口最大化次級屏幕上的窗口主屏幕

- >當鼠標進入主屏幕時,任務欄圖標將完全消失!

如果您再次執行相同的再生操作,該圖標會重新出現。

我也試過使用.NET 4.5或.NET 4.5.1!

任何人都可以解釋這個問題嗎?

謝謝!

+0

均設置完全相同的分辨率是多少? –

+0

不,我用1920x1200和1280x1024測試過它。但是,如果我將兩個設置爲相同的分辨率(2 x 1280x1024),我獲得了相同的結果。 我也在Windows 8上測試它,任務欄圖標也會消失。 –

+0

我有類似的問題,但是當從主要屏幕移動到任何次要屏幕時,即移動到另一個顯示器時,任務欄「圖標」消失。我有3臺顯示器。所有顯示器的分辨率都相同還運行8.1。 – nietras

回答

4

經過一些試驗和錯誤調試,我發現,窗口可見性設置爲false,然後更新系統菜單,然後設置爲true。

我認爲這是沒有必要的,併產生這個討厭的問題

這裏是WindowChromeWorker

private void _UpdateSystemMenu(WindowState? assumeState) 
{ 
    const MF mfEnabled = MF.ENABLED | MF.BYCOMMAND; 
    const MF mfDisabled = MF.GRAYED | MF.DISABLED | MF.BYCOMMAND; 

    WindowState state = assumeState ?? _GetHwndState(); 

    if (null != assumeState || _lastMenuState != state) 
    { 
     _lastMenuState = state; 

     bool modified = _ModifyStyle(WS.VISIBLE, 0); 

     IntPtr hmenu = NativeMethods.GetSystemMenu(_hwnd, false); 
     if (IntPtr.Zero != hmenu) 
     { 
      // change menu items 
      ... 
     } 

     if (modified) 
     { 
      _ModifyStyle(0, WS.VISIBLE); 
     } 
    } 
} 

的方法,所以你可以嘗試看看到我的

WPF Shell Integration Library (Ex)tended Edition

分支

原始來源可發現here

here是一個小的測試應用程序

希望幫助

+0

非常感謝你爲這個bug修復。它工作得很好! –

2

看來,只有當您在WPF窗口上設置WindowStyle="None"時纔會出現此錯誤。此外,這個選項還會打破現代應用程序,這些應用程序在最大化您的應用程序時被捕獲到一邊。這看起來很奇怪,但使用WindowChrome刪除窗口邊框時,不需要設置WindowStyle,因此您可以安全地跳過它。

唯一需要注意的是,你不能使用AllowTransparency(但它沒問題,因爲你不應該首先使用它,因爲這個選項有很多的性能問題)。

+0

「...但使用WindowChrome時不需要設置WindowStyle ...」這不是真的 – punker76

+0

@ punker76我有我的開發機器上的工作示例否則說。 .. – ghord

相關問題