这是一个有点平凡的问题,但在我看来,在WPF中没有内置的方法。似乎只有作为枚举的WindowState
属性没有帮助,因为我无法判断窗口在最小化之前是否处于Normal
或Maximized
状态。
当点击任务栏图标时,窗口正在按照预期恢复,假设其先前的状态,但我似乎找不到任何定义的方法来做到这一点。
所以我一直在想,如果我只是错过了一些东西,或者如果我需要使用一些自定义的交互逻辑。
(我会张贴我目前的解决方案作为答案)
不确定这是否适用于每个人,但我今天遇到了这个问题,团队中有人建议"你试过Normal"吗?
结果证明他是对的。下面的代码似乎可以很好地恢复您的窗口:
if (myWindow.WindowState == WindowState.Minimized)
myWindow.WindowState = WindowState.Normal;
这工作得很好,如果需要,将窗口恢复到最大化。在调用WindowState时,首先检查最小化状态似乎很关键。正常第二次将"恢复";将窗口设置为非最大化状态
SystemCommands类有一个名为RestoreWindow的静态方法,用于将窗口恢复到以前的状态。
SystemCommands.RestoreWindow(this); // this being the current window
[注意:SystemCommands类是。net 4.5+ (MSDN Ref)的一部分,针对早期版本的框架的项目可以使用WPF Shell扩展(MSDN Ref)]
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,
}
}
出于某种原因,
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;
}
}
要恢复,必须分别设置WindowState
:
this.WindowState = _lastNonMinimizedState;
嗯,公认的答案对我不起作用。当从任务栏中召回"最大化"窗口时,它最终会在屏幕上居中(以正常大小显示,即使它的状态是最大化的),而像通过标题栏拖动窗口这样的事情最终不起作用。最终(基本上是通过反复试验),我找到了如何做到这一点。感谢@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;
}
在本机Windows中,您可以使用ShowWindow(SW_RESTORE)
:
激活并显示窗口。如果窗口被最小化或最大化,系统将恢复其原始大小和位置。应用程序在恢复最小化窗口时应该指定此标志。
肯定有。net对应的