有两种(看起来)惯用的方法可以在代码中最小化 WPF 窗口:
window.WindowState = window.WindowState.Minimized
SystemCommands.MinimizeWindow(window)
所需的行为是看到 windows 11 窗口最小化动画。实际行为是窗口立即从屏幕上消失。
请注意:这是用于具有自定义镶边的窗口 - 因此从代码中触发行为似乎是必要的:
<Window
WindowStyle="None"
AllowTransparency="True
Background="Transparent">
<!-- custom windows chrome here -->
</Window>
这是 .NET 5(和 6)的 WPF 桌面包中的缺陷吗?
如果不使用标准 chrome 恢复到默认窗口,如何无法获得所需的行为?使用 WinUI 3.0 窗口不是一个选项,因为 XAML 岛尚未发布,需要逐步现代化。
网上有一些建议的解决方案,例如:
还有另一个(旧)stackoverflow 问题:
但是,我无法让它与具有透明背景的窗口一起使用。
=====问题关闭后更新=====
审稿人:请在投票之前仔细阅读此内容以再次关闭问题并指出确切可行的解决方案。
现有答案的问题:
第一个建议是改变WindowStyle,然后是WindowState;这带来了一个问题,因为它需要 AllowTransparency=false,这违背了此处练习的目的 - 即获取自定义镶边。
其他建议是使用 Win32 API。我再次尝试这样做,但它在我的设置中不起作用。我还没有记录我收到的确切错误消息。但是,再次查看代码有一个明显的问题:它与第一个建议具有相同的窗口要求:窗口不能是透明的 - 观察旧答案中的代码:
private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == ApiCodes.WM_SYSCOMMAND) { if (wParam.ToInt32() == ApiCodes.SC_MINIMIZE) { WindowStyle = WindowStyle.SingleBorderWindow; WindowState = WindowState.Minimized; handled = true; } else if (wParam.ToInt32() == ApiCodes.SC_RESTORE) { WindowState = WindowState.Normal; WindowStyle = WindowStyle.None; handled = true; } } return IntPtr.Zero; }