繁体   English   中英

如何在代码隐藏中恢复最小化的窗口?

[英]How to restore a minimized Window in code-behind?

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

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

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

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

不确定这对所有人都有用,但我今天碰到了这个,团队中的某个人建议“ 你试过普通 ”吗?

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

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

这工作正常,如果需要,将窗口恢复到最大化。 在调用WindowState时首先检查最小化状态似乎很关键。第二次将窗口“恢复”到非最大化状态。

希望这可以帮助。

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,
    }
}

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

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

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

由于某些原因,

WindowState = WindowState.Normal;

不适合我。 所以我使用了以下代码,它工作..

 Show();
 WindowState = WindowState.Normal;

以下是我现在如何恢复它:我处理StateChanged事件以跟踪Minimized的最后状态

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

要恢复i,则必须分别设置WindowState

this.WindowState = _lastNonMinimizedState;

嗯,接受的答案对我不起作用。 当从任务栏调用时,“最大化”窗口最终会在屏幕上居中(以正常大小显示,即使其状态最大化),并且通过其标题栏拖动窗口等操作最终无法正常工作。 最终(几乎是试错),我想出了如何做到这一点。 感谢@HB和@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;
}

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

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

肯定是.Net对应的那个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM