如何在代码隐藏中恢复最小化的窗口?
这是一个平凡的问题,但在我看来,在WPF中没有内置的方法。 只有似乎是WindowState
属性是一个枚举没有帮助,因为我不能告诉窗口是否处于Normal
或Maximized
状态之前被最小化。
当单击任务栏图标窗口正在恢复正常,假设其以前的状态,但我似乎无法find任何定义的方法,这样做。
所以我一直在想,如果我只是缺less的东西,或者如果我需要使用一些自定义的交互逻辑。
( 我会张贴我当前的解决scheme作为答案 )
不知道这对每个人都适用,但今天我遇到了这个问题,团队中有人提出“ 你有没有试过Normal ”?
原来他是对的。 以下似乎很好地恢复你的窗口:
if (myWindow.WindowState == WindowState.Minimized) myWindow.WindowState = WindowState.Normal;
这工作得很好,如果需要恢复窗口最大化。 首先检查最小化状态似乎很重要,因为调用WindowState.Normal第二次会将窗口“还原”到其非最大化状态。
希望这可以帮助。
WPF的观点是这是一个操作系统function。 如果你想搞乱操作系统的function,你可能不得不弄脏你的手。 幸运的是,他们为我们提供了这样做的工具。 这是一个联合国最小化的方法,采取WPF窗口,并使用WIN32来完成的效果,而不logging任何状态:
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参考)的一部分,用于面向早期版本Framework的项目可以使用WPF Shell扩展(MSDN参考) ]
下面是我如何得到它现在恢复:我处理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;
嗯,接受的答案不适合我。 从任务栏中调出的“最大化”窗口最终会在屏幕上居中alignment(以正常大小显示,即使其状态为“最大化”),而通过标题栏拖动窗口等操作也不起作用。 最后(几乎是通过试验和错误),我想出了如何做到这一点。 感谢@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; }
因为某些原因,
WindowState = WindowState.Normal;
没有为我工作。 所以我用下面的代码和它的工作..
Show(); WindowState = WindowState.Normal;
在本机窗口中,您可以使用ShowWindow (SW_RESTORE)
将窗口恢复到以前的状态:
激活并显示窗口。 如果窗口被最小化或最大化,则系统将其恢复到其原始大小和位置。 应用程序应该在还原最小化窗口时指定此标志。
毫无疑问,.net与此相对应。
在最小化之后尝试恢复时要小心。 我只是解决了一个问题,即将WindowState设置为“正常”并未按预期恢复窗口。 这个问题最终在最小化之后以及在将其设置回正常之前更改了“可见性”属性(“折叠”)。