8

我在 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 设置:

  • 2 台带扩展桌面的显示器
  • 任务栏仅在主桌面上可见

复制:

  1. 启动 WPF 应用程序
  2. 在辅助屏幕上移动窗口
  3. 最大化辅助屏幕上的窗口(例如通过将窗口停靠在顶部)
  4. 将窗口从辅助屏幕恢复并拖动到主屏幕

--> 当鼠标进入主屏幕时,任务栏图标将消失!

如果您再次执行相同的复制,该图标会再次出现。

我还尝试使用 .NET 4.5 或 .NET 4.5.1!

谁能解释这个问题?

谢谢!

4

2 回答 2

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 集成库(Ex)扩展版

原始来源可以在这里找到

这里还有一个小测试应用程序

希望有帮助

于 2014-04-11T12:25:18.270 回答
2

似乎只有在您WindowStyle="None"在 WPF 窗口上设置时才会出现此错误。此外,此选项还会破坏现代应用程序,这些应用程序在最大化您的应用程序时会卡在一边。这可能看起来很奇怪,但使用删除窗口边框WindowStyle时不需要设置,因此您可以安全地跳过它。WindowChrome

唯一需要注意的是您不能使用AllowTransparency(但没关系,因为由于此选项存在广泛的性能问题,您不应该首先使用它)。

于 2014-03-30T22:05:47.430 回答