【问题标题】:Minimize window using Windows 11 animation effect使用 Windows 11 动画效果最小化窗口
【发布时间】:2021-12-05 08:27:23
【问题描述】:

有两种(看起来)惯用的方法可以在代码中最小化 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,这违背了此处练习的目的 - 即获取自定义 chrome。

  • 其他建议是使用 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;
    }
    

【问题讨论】:

    标签: wpf windows .net-5 windows-11


    【解决方案1】:

    它似乎在 Themes of .NET 的路线图上,用于 .NET 7:

    这个惊人的开源项目刚刚登陆:

    • WPF UI - 适用于 WPF 的 Windows 11 样式和控件

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多