要移除标准窗框,请将属性设置Window.WindowStyle为None。我们得到这个窗口:
我们看到一个 1 像素的灰色边框,顶部有一个白色(我猜是窗口背景颜色)条纹和一个投影。窗口是可调整大小的,并且调整大小的框架位于可见窗口框架之外(顶部边框除外,Microsoft 决定它应该正好在可见框架内 - 而不是在阴影上)。
我想让这个顶部边框不可见,在顶部留下调整窗口大小的选项。我很高兴有一个解决方案,它可以让我自己的按钮简单地放在这个框架顶部的边缘。
您可以制作一个窗口AllowsTransparency,但随后阴影、窗口大小调整框架将消失(显然,整个非客户区都消失了,窗口完全由我们支配)并最小化/最大化动画。当然,您可以尝试自己完成所有操作:只需使用一些元素(例如 )创建自己的窗口大小调整框架Rectangle,在其下绘制阴影,忘记最小化/最大化动画。
但是有一个非常令人不快的效果 - 当窗口调整大小超出这种非标准框架时,它会抽搐很多。那些。一个正常的窗口调用SetWindowPos会AllowsTransparency导致这样的问题。使用标志SWP_NOCOPYBITS并不能解决问题(这意味着您不需要提供创建处理程序 on WM_WINDOWPOSCHANGING(和 on WM_NCCALCSIZE,据我所知,类似地)以及在那里做什么)。通常这种行为是由于给应用程序更新窗口内容的临时配额过期了,Windows 本身复制了左上角的内容,并用背景颜色填充了剩余的窗口空间(然后应用程序本身必须“赶上”)。在禁用 Aero 的 Windows 7 上,问题仍然存在。
所以问题是如何将自定义元素放置在标准窗口大小调整边框之上,或者消除调用SetWindowPos这种窗口样式的效果。
为什么WindowChrome它不起作用:是的,使用这种WindowChrome抽搐确实消失了,但条件是它GlassFrameThickness不是 0 和NonClientFrameEdgesnot None。后者在指示的一侧添加相同的条带。AllowsTransparency不能与此类属性值一起使用(我只是没有从任务栏最大化窗口)。
该项目正在.NET 4.5 下构建。

由于新版本 Windows 中的DWM 限制,您将无法在调整大小时完全消除闪烁。事实上,最知名的 WPF 应用程序 Visual Studio 也受到此问题的影响,至少在 VS 2017 中是这样。但在我的测试中,最好的结果是通过处理WM_NCCALCSIZE消息并通过自定义 WM_NCHITTEST 处理程序实现调整大小:
看起来像这样:
为 Windows 10 量身定做。在 Windows 7 中,该方法也有效并且效果很好,但窗口样式必须为
WindowStyle="None". 对于其他样式,相反边缘的闪烁会返回。在 Windows 10 中,当使用 None 样式时,折叠-展开动画会消失,因此对于不同版本的 Windows,您需要设置不同的样式。