web-dev-qa-db-fra.com

Comment restaurer une fenêtre minimisée en code-behind?

C'est en quelque sorte une question banale mais il me semble qu'il n'y a pas de méthode intégrée pour cela dans WPF. Il semble seulement y avoir la propriété WindowState qui étant une énumération n'aide pas car je ne peux pas dire si la fenêtre était dans l'état Normal ou Maximized avant d'être minimisée.

Lorsque vous cliquez sur l'icône de la barre des tâches, la fenêtre est restaurée comme prévu, en supposant son état antérieur, mais je n'arrive pas à trouver de méthode définie qui le fasse.

Je me suis donc demandé si je manquais quelque chose ou si j'avais besoin d'utiliser une logique d'interaction personnalisée.

(je posterai ma solution actuelle comme réponse)

43
H.B.

Je ne sais pas si cela fonctionnera pour tout le monde, mais je suis tombé dessus aujourd'hui et quelqu'un sur l'équipe a suggéré " avez-vous essayé Normal "?

Il s'avère qu'il avait raison. Ce qui suit semble bien restaurer votre fenêtre:

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

Cela fonctionne très bien, en restaurant la fenêtre en maximisé si nécessaire. Il semble essentiel de vérifier d'abord l'état minimisé en appelant WindowState.Normal une deuxième fois "restaurera" votre fenêtre à son état non maximisé.

J'espère que cela t'aides.

81
Eric Liprandi

Le point de vue de WPF est qu'il s'agit d'une fonctionnalité de système d'exploitation. Si vous voulez jouer avec les fonctionnalités du système d'exploitation, vous devrez peut-être vous salir les mains. Heureusement, ils nous ont fourni les outils pour le faire. Voici une méthode UN-minimiser qui prend une fenêtre WPF et utilise WIN32 pour accomplir l'effet sans enregistrer aucun état:

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,
    }
}
15
Rick Sladkey

La classe SystemCommands a une méthode statique appelée RestoreWindow qui restaure la fenêtre à la précédente Etat.

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

[Remarque: La classe SystemCommands fait partie de .NET 4.5+ (MSDN Ref) pour les projets qui ciblent des versions antérieures de Framework peut utiliser l'extension WPF Shell (MSDN Ref) ]

12
kiran

Pour certaines raisons,

WindowState = WindowState.Normal;

n'a pas fonctionné pour moi. J'ai donc utilisé le code suivant et cela a fonctionné ..

 Show();
 WindowState = WindowState.Normal;
5
Dark Knight

Voici comment le récupérer pour le moment: je gère l'événement StateChanged pour garder une trace du dernier état qui n'était pas Minimized

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

Pour restaurer, je dois alors définir ce WindowState respectivement:

this.WindowState = _lastNonMinimizedState;
3
H.B.

Hmmm, la réponse acceptée n'a pas fonctionné pour moi. La fenêtre "maximisée", lorsqu'elle est rappelée de la barre des tâches, finit par se centrer (s'afficher dans sa taille normale, même si son état est maximisé) à l'écran et des choses comme faire glisser la fenêtre par sa barre de titre ne fonctionnent pas. Finalement (à peu près par essais et erreurs), j'ai compris comment le faire. Merci à @ H.B. et @Eric Liprandi pour m'avoir guidé vers la réponse! Le code suit:

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
Heliac

Dans Windows natif, vous pouvez restaurer votre fenêtre à un état précédent avec ShowWindow(SW_RESTORE):

Active et affiche la fenêtre. Si la fenêtre est réduite ou agrandie, le système la restaure à sa taille et à sa position d'origine. Une application doit spécifier cet indicateur lors de la restauration d'une fenêtre réduite.

Il y a sûrement une contrepartie .Net à cela.

0
Alexey Ivanov