ventanas ventana una otra navegacion entre dentro cerrar abrir wpf window state restore minimize

una - cerrar ventana wpf c#



¿Cómo restaurar una ventana minimizada en el código subyacente? (7)

Esta es una pregunta un tanto mundana, pero me parece que no hay ningún método incorporado para ello en WPF. Parece que solo existe la propiedad WindowState , que ser un enumeración no ayuda, ya que no puedo saber si la ventana estaba en el estado Normal o Maximized antes de minimizarla.

Al hacer clic en el icono de la barra de tareas, la ventana se está restaurando como se esperaba, asumiendo su estado anterior, pero parece que no puedo encontrar ningún método definido que lo haga.

Así que me he estado preguntando si me falta algo o si necesito usar alguna lógica de interacción personalizada.

( Voy a publicar mi solución actual como respuesta )


Así es como lo hago para restaurar ahora: manejo el evento StateChanged para hacer un seguimiento del último estado que no se Minimized

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

Para restaurar entonces tengo que configurar ese WindowState respectivamente:

this.WindowState = _lastNonMinimizedState;


El punto de vista de WPF es que esta es una característica del sistema operativo. Si quiere perder el tiempo con las características del sistema operativo, es posible que tenga que ensuciarse las manos. Por suerte nos han proporcionado las herramientas para hacerlo. Aquí hay un método de minimización de la ONU que toma una ventana de WPF y usa WIN32 para lograr el efecto sin registrar ningún estado:

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


En Windows nativo, puede restaurar su ventana a un estado anterior con ShowWindow (SW_RESTORE) :

Activa y muestra la ventana. Si la ventana está minimizada o maximizada, el sistema la restaura a su tamaño y posición originales. Una aplicación debe especificar este indicador al restaurar una ventana minimizada.

Seguro que hay una contraparte .Net de eso.


Hmmm, la respuesta aceptada no funcionó para mí. La ventana "maximizada", cuando se recuperaba de la barra de tareas, terminaría centrándose (mostrando en su tamaño Normal, aunque su estado es Maximizado) en la pantalla y cosas como arrastrar la ventana por su barra de título terminaron sin funcionar. Finalmente (bastante por ensayo y error), descubrí cómo hacerlo. Gracias a @HB y @Eric Liprandi por guiarme a la respuesta. El código sigue:

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


No estoy seguro de que esto funcione para todos, pero me encontré con esto hoy y someone del equipo me sugirió " ¿has probado Normal ?"

Resulta que tenía razón. Lo siguiente parece restaurar su ventana muy bien:

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

Eso funciona bien, restaurando la ventana a Maximizado si es necesario. Parece crítico comprobar primero el estado minimizado, ya que llamar a WindowState. Normalmente, una segunda vez "restaurará" su ventana a su estado no maximizado.

Espero que esto ayude.


Por alguna razón,

WindowState = WindowState.Normal;

no funciono para mi Así que utilicé el siguiente código y funcionó ..

Show(); WindowState = WindowState.Normal;


La clase SystemCommands tiene un método estático llamado RestoreWindow que restaura la ventana al estado anterior.

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

[Nota: la clase SystemCommands es parte de .NET 4.5+ (Ref. MSDN) para proyectos dirigidos a versiones anteriores de Framework que pueden usar la extensión WPF Shell (Ref. MSDN) ]