使用Windows 11动画效果最小化window
Minimize window using Windows 11 animation effect
有两种(看起来)惯用的方法可以在代码中最小化 WPF window:
window.WindowState = window.WindowState.Minimized
SystemCommands.MinimizeWindow(window)
期望的行为是看到 windows 11 window 最小化动画。实际行为是 window 立即从屏幕上消失。
请注意:这是针对具有自定义 chrome 的 window - 因此似乎有必要从代码触发行为:
<Window
WindowStyle="None"
AllowTransparency="True
Background="Transparent">
<!-- custom windows chrome here -->
</Window>
这是 .NET 5(和 6)的 WPF 桌面包中的缺陷吗?
如果不使用标准 chrome 恢复到默认值 windows,怎么会得不到想要的行为呢?使用 WinUI 3.0 window 不是一个选项,因为 XAML islands 尚未发布,需要逐步现代化。
网上有一些建议的解决方案,例如:
还有另一个(旧的)Whosebug 问题:
- Custom window style with minimize animation
但是,我无法让它与具有透明背景的 window 一起使用。
=====问题关闭后更新=====
审稿人:请在投票前仔细阅读本文以再次关闭问题并指出确切可行的解决方案。
现有答案的问题:
第一个建议是改变WindowStyle,然后是WindowState;这会带来一个问题,因为它需要 AllowTransparency=false,这违背了这里练习的目的——获得自定义 chrome.
其他建议是使用Win32 API的。我再次尝试这样做,但它在我的设置中不起作用。我还没有记录我收到的确切错误消息。但是,再次查看代码有一个明显的问题:它具有与第一个建议相同的 window 要求:window 不能透明 - 请观察旧答案中的代码:
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;
}
它似乎在 Themes of .NET for .NET 7 的路线图上:
还有这件 open-source 的精彩作品刚刚登陆:
- WPF UI - Windows WPF 的 11 种样式和控件
有两种(看起来)惯用的方法可以在代码中最小化 WPF window:
window.WindowState = window.WindowState.Minimized
SystemCommands.MinimizeWindow(window)
期望的行为是看到 windows 11 window 最小化动画。实际行为是 window 立即从屏幕上消失。
请注意:这是针对具有自定义 chrome 的 window - 因此似乎有必要从代码触发行为:
<Window
WindowStyle="None"
AllowTransparency="True
Background="Transparent">
<!-- custom windows chrome here -->
</Window>
这是 .NET 5(和 6)的 WPF 桌面包中的缺陷吗?
如果不使用标准 chrome 恢复到默认值 windows,怎么会得不到想要的行为呢?使用 WinUI 3.0 window 不是一个选项,因为 XAML islands 尚未发布,需要逐步现代化。
网上有一些建议的解决方案,例如:
还有另一个(旧的)Whosebug 问题:
- Custom window style with minimize animation
但是,我无法让它与具有透明背景的 window 一起使用。
=====问题关闭后更新=====
审稿人:请在投票前仔细阅读本文以再次关闭问题并指出确切可行的解决方案。
现有答案的问题:
第一个建议是改变WindowStyle,然后是WindowState;这会带来一个问题,因为它需要 AllowTransparency=false,这违背了这里练习的目的——获得自定义 chrome.
其他建议是使用Win32 API的。我再次尝试这样做,但它在我的设置中不起作用。我还没有记录我收到的确切错误消息。但是,再次查看代码有一个明显的问题:它具有与第一个建议相同的 window 要求:window 不能透明 - 请观察旧答案中的代码:
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; }
它似乎在 Themes of .NET for .NET 7 的路线图上:
还有这件 open-source 的精彩作品刚刚登陆:
- WPF UI - Windows WPF 的 11 种样式和控件