【问题标题】:How to restore a minimized Window in code-behind?如何在代码隐藏中恢复最小化的窗口?
【发布时间】:2011-07-28 17:48:23
【问题描述】:

这是一个有点普通的问题,但在我看来,WPF 中没有内置的方法。似乎只有 WindowState 属性作为枚举没有帮助,因为我无法判断窗口在最小化之前是处于 Normal 还是 Maximized 状态。

单击任务栏图标时,窗口正在按预期恢复,假设其先前状态,但我似乎找不到任何已定义的方法。

所以我一直想知道我是否只是缺少某些东西,或者我是否需要使用一些自定义交互逻辑。

我将发布我当前的解决方案作为答案

【问题讨论】:

  • 你在调用 this.Show() 吗?或者你正在改变状态?
  • @Akash Kava Window.Show 只影响可见性,对窗口状态没有影响。最小化是一个状态问题。
  • 好吧,我检查了反射器调用 Show() 确实调用了其他人提到的 ShowWindow api,我想知道您是否尝试过 this.Show() ?因为我用过它,可能我没有注意到。
  • 它不调用ShowWindow 并且它不起作用。正如我所说,它只设置可见性(并等待加载的事件触发)。

标签: wpf window state restore minimize


【解决方案1】:

不确定这是否适用于所有人,但我今天遇到了这个问题,团队中的 someone 建议“你尝试过正常”吗?

事实证明他是对的。以下似乎可以很好地恢复您的窗口:

if (myWindow.WindowState == WindowState.Minimized)
    myWindow.WindowState = WindowState.Normal;

效果很好,如果需要,可以将窗口恢复为最大化。首先检查最小化状态似乎很重要,因为第二次调用 WindowState.Normal 会将您的窗口“恢复”到其非最大化状态。

希望这会有所帮助。

【讨论】:

  • 与 H.B. 类似的观点。花了十分钟想知道如何解决这个问题,然后在这里绊倒并看到它只是自动的。
【解决方案2】:

SystemCommands 类有一个名为 RestoreWindow 的静态方法,可以将窗口恢复到以前的状态。

SystemCommands.RestoreWindow(this); // this being the current window

[注意:SystemCommands 类是 .NET 4.5+ 的一部分 (MSDN Ref),针对早期版本 Framework 的项目可以使用 WPF Shell 扩展 (MSDN Ref)]

【讨论】:

  • +1 将ShowInTaskbar="False"TrayIcon 一起使用并更改Visibility to Hidden 时,将恢复窗口恢复为正常会出现问题。但这很好用。
【解决方案3】:

WPF 的观点是这是一个操作系统特性。如果你想弄乱操作系统的特性,你可能不得不弄脏你的手。幸运的是,他们为我们提供了这样做的工具。下面是一个 UN-minimize 方法,它采用 WPF 窗口并使用 WIN32 来完成效果而不记录任何状态:

public static class Win32
{
    public static void Unminimize(Window window)
    {
        var hwnd = (HwndSource.FromVisual(window) as HwndSource).Handle;
        ShowWindow(hwnd, ShowWindowCommands.Restore);
    }

    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);

    private enum ShowWindowCommands : int
    {
        /// <summary>
        /// Activates and displays the window. If the window is minimized or 
        /// maximized, the system restores it to its original size and position. 
        /// An application should specify this flag when restoring a minimized window.
        /// </summary>
        Restore = 9,
    }
}

【讨论】:

  • 感谢您的回答。到目前为止,我几乎从未使用过外部调用,所以我想知道,有没有办法导入完整的 ShowWindowCommands 枚举?
  • @H.B. pinvoke.net 网站有完整的枚举;我只刮了我们需要的一行。你可以谷歌“pinvoke win32api”例如“pinvoke ShowWindow”查找要剪切和粘贴的代码。 ShowWindowCommands 的其余部分位于pinvoke.net/default.aspx/Enums/ShowWindowCommand.html
  • 再次感谢您(我不知道枚举的部分定义就足够了)
  • 因为它是互操作的,只有大小很重要;即使是 int 或 uint 也可以。
  • 一个新的答案进来了,很抱歉接受你,但简单显然更可取。
【解决方案4】:

由于某种原因,

WindowState = WindowState.Normal;

对我不起作用。 所以我使用了以下代码并且它工作了..

 Show();
 WindowState = WindowState.Normal;

【讨论】:

  • 为我工作:)
【解决方案5】:

这是我现在恢复它的方法:我处理StateChanged 事件以跟踪不是Minimized 的最后一个状态

WindowState _lastNonMinimizedState = WindowState.Maximized;
private void Window_StateChanged(object sender, EventArgs e)
{
    if (this.WindowState != System.Windows.WindowState.Minimized)
    {
        _lastNonMinimizedState = WindowState;
    }
}

要恢复我必须分别设置WindowState

this.WindowState = _lastNonMinimizedState;

【讨论】:

    【解决方案6】:

    嗯,接受的答案对我不起作用。当从任务栏中调用时,“最大化”窗口最终会在屏幕上居中(以正常大小显示,即使其状态为最大化),并且通过标题栏拖动窗口等操作最终无法正常工作。最终(几乎通过反复试验),我想出了如何去做。感谢@H.B。和@Eric Liprandi 指导我找到答案!代码如下:

    private bool windowIsMinimized = false;
    private WindowState lastNonMinimizedState = WindowState.Normal;
    
    private void Window_StateChanged(object sender, EventArgs e)
    {
        if (this.windowIsMinimized)
        {
            this.windowIsMinimized = false;
            this.WindowState = WindowState.Normal;
            this.WindowState = this.lastNonMinimizedState;
        }
        else if (this.WindowState == WindowState.Minimized)
        {
            this.windowIsMinimized = true;
        }
    }
    
    private void Window_MinimizeButtonClicked(object sender, MouseButtonEventArgs e)
    {
        this.lastNonMinimizedState = this.WindowState;
        this.WindowState = WindowState.Minimized;
        this.windowIsMinimized = true;
    }
    
    private void Window_MaximizeRestoreButtonClicked(object sender, MouseButtonEventArgs e)
    {
        if (this.WindowState == WindowState.Normal)
        {
            this.WindowState = WindowState.Maximized;
        }
        else
        {
            this.WindowState = WindowState.Normal;
        }
    
        this.lastNonMinimizedState = this.WindowState;
    }
    

    【讨论】:

      【解决方案7】:

      在本机 Windows 中,您可以使用 @987654321@(SW_RESTORE) 将窗口恢复到以前的状态:

      激活并显示窗口。如果窗口被最小化或最大化,系统会将其恢复到原来的大小和位置。应用程序在恢复最小化窗口时应指定此标志。

      肯定有 .Net 与之对应。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多