我在Windows 8.1上使用自定义样式的WPF窗口时出现问题。我用WindowChrome编写了一个简单的透明WPF窗口,用于默认的窗口拖动行为:
<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设置:
摄制:
- &GT;当鼠标进入主屏幕时,任务栏图标将完全消失!
如果再次执行相同的复制,则会再次出现图标。
我还尝试使用.NET 4.5或.NET 4.5.1!
任何人都可以解释这个问题吗?
谢谢!
答案 0 :(得分: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也是一个小测试应用
希望有所帮助
答案 1 :(得分:2)
似乎只有在WPF窗口中设置WindowStyle="None"
时才会出现此错误。此外,此选项还会破坏现代应用程序,这些应用程序在最大化应用程序时会被捕捉到一边。这可能看起来很奇怪,但使用WindowStyle
删除窗口边框时不需要设置WindowChrome
,因此您可以安全地跳过它。
唯一需要注意的是,你不能使用AllowTransparency
(但它没关系,因为这个选项存在大量性能问题,所以你不应该首先使用它。)