Wpf 在Windows 8.1上使用WindowChrome时,任务栏图标消失

Wpf 在Windows 8.1上使用WindowChrome时,任务栏图标消失,wpf,xaml,.net-4.5,windows-8.1,window-chrome,Wpf,Xaml,.net 4.5,Windows 8.1,Window Chrome,我在Windows8.1上使用自己风格的WPF窗口时遇到一些问题。我用WindowChrome编写了一个简单的透明WPF窗口,用于默认的windows拖动行为: <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winf

我在Windows8.1上使用自己风格的WPF窗口时遇到一些问题。我用WindowChrome编写了一个简单的透明WPF窗口,用于默认的windows拖动行为:

<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台带有扩展桌面的显示器
  • 任务栏仅在主桌面上可见
复制:

  • 启动WPF应用程序
  • 移动辅助屏幕上的窗口
  • 最大化辅助屏幕上的窗口(例如,将窗口停靠在顶部)
  • 将窗口从辅助屏幕恢复并拖动到主屏幕
  • -->当鼠标进入主屏幕时,任务栏图标将完全消失

    如果再次执行相同的复制,图标将重新出现

    我还尝试使用.NET4.5或.NET4.5.1

    有人能解释这个问题吗


    谢谢大家!

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


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

    经过一些尝试和错误调试后,我发现窗口可见性设置为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);
            }
        }
    }
    
    所以你可以试着看看我的分支

    可以找到原始来源

    也是一个小小的测试应用


    希望有帮助

    都设置为完全相同的分辨率?没有,我用1920x1200和1280x1024测试过。但如果我将两者设置为相同的分辨率(2x1280x1024),则得到相同的结果。我也在windows 8上测试了它,任务栏图标也消失了。我有一个类似的问题,但在这里,当从主屏幕移动到任何辅助屏幕时,即移动到另一个显示器时,任务栏“图标”消失了。我有3台显示器。所有监视器的分辨率相同。我已经发布了一个关于MicrosoftConnect的错误报告:是的。在Windows8.0上也是这样。这东西看起来太多了,不适合生产。这看起来是个不错的主意,但我想我会回到DwmExtendFrameIntoClientArea,除非有新版本。”…但在使用WindowChrome时不需要设置WindowsStyle…”这不是真的非常感谢您的错误修复。它工作得很好!