2014-01-22 4 views
8

У меня есть некоторые проблемы с собственным стильным WPF-окном в Windows 8.1. Я написал простое прозрачное окно WPF с WindowChrome по умолчанию окна перетаскивать поведение:Иконка панели задач исчезает, когда WindowChrome используется в Windows 8.1

<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 мониторов с расширенным рабочим столом
  • панелью задачи отображаются только на основном рабочем столе

Repro:

  1. запустить приложение WPF
  2. Переместить окно на вторичном экране
  3. Развертывание окна на вторичном экране (например, путем стыковки окна на вершине)
  4. Восстановление и перетащить окно из вторичного экрана к основной экран

-> Значок панели задач исчезнет точно, когда мышь входит в основной экран!

Если вы повторите повторный повтор, значок снова появится.

Я также пытался использовать .NET 4.5 или .NET 4.5.1!

Может ли кто-нибудь объяснить эту проблему?

Спасибо!

+0

оба установлены в точно такой же размер? –

+0

Нет. Я тестировал его с разрешением 1920x1200 и 1280x1024. Но если я установил оба значения с одинаковым разрешением (2x 1280x1024), я получил тот же результат. Я также тестирую его на окнах 8, значок панели задач также исчезает. –

+0

У меня есть аналогичная проблема, но здесь панель задач «значок» исчезает при переходе от основного к любому второстепенному экрану, т. Е. Как только перемещается на другой монитор. У меня есть 3 монитора. Все мониторы имеют одинаковое разрешение. Также работает 8.1. – nietras

ответ

4

после некоторой пробной и ошибочной отладки, я понял, что видимость окна установлена ​​в значение «ложь», а затем обновляет системное меню и после этой установки значение «true».

я думаю, что это не является необходимым и производит эту неприятную Issue

здесь метод на 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

Большое вам спасибо за это исправление. Он работает очень хорошо! –

2

Кажется, что эта ошибка появляется только при установке WindowStyle="None" в окне WPF. Кроме того, этот параметр также нарушает современные приложения, которые привязаны к боку при максимальном использовании приложения. Это может показаться странным, но установка WindowStyle не требуется при использовании WindowChrome, чтобы удалить границы окна, чтобы вы могли спокойно пропустить его.

Единственное предостережение в том, что вы не можете использовать AllowTransparency (но все в порядке, поскольку вы не должны использовать его в первую очередь из-за больших проблем с производительностью с этой опцией).

+0

«... но установка WindowStyle не требуется при использовании WindowChrome ...», это не так. – punker76

+0

@ punker76 У меня есть рабочий пример на моей машине dev, которая говорит иначе. .. – ghord