WPF WindowChrome 性能/工件

问题描述 投票:0回答:1

我在 WPF 应用程序中使用

WindowChrome
,以便我可以自定义标题栏的外观。

但是,我注意到一些问题。

  • 应用程序的性能似乎有所下降。当在宽屏显示器上最大化窗口时,动画确实开始出现卡顿。奇怪的是,如果您将窗口大小调整为与最大化窗口大致相同的大小,则不会看到问题。

  • 当您从左侧或顶部边框边缘调整窗口大小时,随着内容重新绘制,您会得到非常明显的伪影。看起来好像窗口的内容正在拉伸以适应,但存在延迟,因此看起来非常糟糕且紧张。但只能从左边缘或上边缘调整大小。右下角没有问题

如果我移除

WindowChrome
,这两个问题都会消失。

我想知道是否有替代方案?

使用

WindowStyle=None
似乎效果很好。这为您提供了大部分功能,除了正确的最大化尺寸(覆盖任务栏)和窗口拖动之外。两者都可以通过少量代码添加。但令人沮丧的是它在顶部添加了一个白条。有很多关于此的帖子,都建议使用
AllowsTransparency=True
。但这并不是真正的解决方案,因为这样您就会失去边框大小调整(CanResizeWithGrip 并不是很现代)和窗口阴影。

我只是想知道是否有人找到了解决方法?

wpf window styling caption window-chrome
1个回答
0
投票

你并不孤单。这里有一个非常长期存在的问题,这似乎是由最大化时窗口边界超出屏幕边界以及低级 Direct3D 逻辑中的错误(或只是糟糕的编码)的组合引起的,该错误会在最大化时终止硬件加速发生这种情况。对我来说,当我的主窗口溢出到第二个屏幕上(由于边框)时,就会发生这种情况,所以我只在扩展桌面模式下注意到它,但我没有任何理由相信它甚至在单屏。

根据上面链接的 Github 问题上的 posting,通过在应用程序启动时设置 System.Windows.CoreCompatibilityPreferences.EnableMultiMonitorDisplayClipping=true 可以找到解决方法。但我不能保证这一点,因为我很久以前就采用了不同的解决方法。

我的解决方法源于您的观察,设置 

WindowStyle=None

会阻止它。这是因为在此模式下,窗口的边框仍局限于单个监视器。结果是我必须添加自己的所有按钮和逻辑来最大化、最小化、关闭等。

and
必须添加我自己的手柄和鼠标处理程序来调整大小和移动。因此,如果 EnableMultiMonitorDisplayClipping=true 不适合您,重新发明所有主窗口逻辑是我所知道的规避此问题的唯一方法。
    

© www.soinside.com 2019 - 2024. All rights reserved.