¿Cómo restaurar una ventana minimizada en code-behind?


Esta es una pregunta algo mundana, pero me parece que no hay un método incorporado para ello en WPF. Solo parece haber la propiedad WindowState que siendo una enumeración no ayuda ya que no puedo decir si la Ventana estaba en el estado Normal o Maximized antes de ser minimizada.

Al hacer clic en el icono de la barra de tareas, la ventana se está restaurando tal 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 solo me falta algo o si necesito usar alguna lógica de interacción personalizada.

(Publicaré mi solución actual como respuesta )

Author: H.B., 2011-04-03

7 answers

No estoy seguro de que esto funcione para todos, pero me encontré con esto hoy y alguien en el equipo sugirió " ¿has intentado Normal"?

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

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

Eso funciona bien, restaurando la ventana a Maximizada si es necesario. Parece crítico comprobar el estado minimizado primero como llamar a WindowState.Normal una segunda vez "restaurará" su ventana a su no maximizada estado.

Espero que esto ayude.

 74
Author: Eric Liprandi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 22:33:43

El punto de vista de WPF es que esta es una característica del sistema operativo. Si quieres jugar con las funciones del sistema operativo, es posible que tengas que ensuciarte las manos. Afortunadamente nos han proporcionado las herramientas para hacerlo. Aquí hay un método de minimización que toma una ventana 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,
    }
}
 14
Author: Rick Sladkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-04 06:42:31

SystemCommands clase 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 + (MSDN Ref) para proyectos que se dirigen a versiones anteriores de Framework, puede usar la extensión WPF Shell (MSDN Ref)]

 9
Author: kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-25 11:17:16

Así es como puedo restaurarlo ahora mismo: manejo el evento StateChanged para realizar un seguimiento del último estado que no era 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 establecer que WindowState respectivamente:

this.WindowState = _lastNonMinimizedState;
 3
Author: H.B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-03 18:24:44

Por alguna razón,

WindowState = WindowState.Normal;

No funcionó para mí. Así que usé el siguiente código y funcionó..

 Show();
 WindowState = WindowState.Normal;
 2
Author: Dark Knight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-11 21:49:44

Hmmm, la respuesta aceptada no funcionó para mí. La ventana" maximizada", cuando se recupera de la barra de tareas terminaría centrándose (mostrándose en su tamaño normal, aunque su estado esté Maximizado) en la pantalla y cosas como arrastrar la ventana por su barra de título terminarían sin funcionar. Eventualmente (más o menos por ensayo y error), descubrí cómo hacerlo. Gracias a @H. B. 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;
}
 1
Author: Heliac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-16 11:18:46

En Ventanas nativas puede restaurar su ventana a un estado anterior con ShowWindow(SW_RESTORE):

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

Seguramente hay una contraparte.Net para eso.

 0
Author: Alexey Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-03 18:32:58