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

eblbsuwk  于 2022-12-27  发布在  其他
关注(0)|答案(7)|浏览(275)

这是一个很普通的问题,但在我看来,WPF中似乎没有内置的方法。似乎只有WindowState属性,作为枚举没有帮助,因为我无法判断窗口在最小化之前是处于Normal还是Maximized状态。
当单击任务栏图标时,窗口将按预期恢复,假定其先前状态,但我似乎找不到任何定义的方法来执行此操作。
所以我一直在想我是否只是错过了一些东西,或者我是否需要使用一些自定义的交互逻辑。
(* 我将发布我当前的解决方案作为答案 *)

33qvvth1

33qvvth11#

不确定这是否适用于每个人,但我今天遇到了这个问题,团队中有人建议“* 您是否尝试过正常*"?
事实证明他是对的,下面的代码可以很好地恢复你的窗口:

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

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

2guxujil

2guxujil2#

SystemCommands类有一个名为RestoreWindow的静态方法,用于将窗口还原到以前的状态。

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

[Note用法:SystemCommands类是.NET 4.5+ (MSDN Ref)的一部分,对于面向早期版本Framework的项目,可以使用WPF shell 程序扩展(MSDN Ref) ]

ddhy6vgd

ddhy6vgd3#

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

lzfw57am4#

出于某种原因,

WindowState = WindowState.Normal;

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

Show();
 WindowState = WindowState.Normal;
bcs8qyzn

bcs8qyzn5#

下面是我如何让它恢复现在:我处理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;
tyu7yeag

tyu7yeag6#

嗯,这个答案对我不起作用。当从任务栏中调用“最大化”窗口时,它会自动居中(以正常大小显示,尽管它的状态是最大化),以及通过标题栏拖动窗口等操作最终都不起作用。(基本上是通过反复试验),我找到了解决方法。感谢@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;
}
kyks70gy

kyks70gy7#

在本机Windows中,您可以使用[ShowWindow](http://msdn.microsoft.com/en-us/library/ms633548.aspx) (SW_RESTORE)将窗口恢复到以前的状态:
激活并显示窗口。如果窗口被最小化或最大化,系统会将其还原到原始大小和位置。应用程序在还原最小化的窗口时应该指定这个标志。
当然.Net也有类似的东西。

相关问题