Как восстановить свернутое окно в коде позади? - PullRequest
40 голосов
/ 03 апреля 2011

Это несколько приземленный вопрос, но мне кажется, что в WPF нет встроенного метода для этого. Кажется, есть только свойство WindowState, которое, будучи перечислением, не помогает, так как я не могу определить, было ли окно в состоянии Normal или Maximized, до того как его свернули.

При нажатии на значок панели задач окно восстанавливается так, как ожидалось, принимая его предыдущее состояние, но я не могу найти какой-либо определенный метод, который делает это.

Так что мне было интересно, если я что-то упустил или мне нужно использовать какую-то собственную логику взаимодействия.

( Я опубликую свое текущее решение как ответ )

Ответы [ 7 ]

80 голосов
/ 27 июля 2011

Не уверен, что это будет работать для всех, но я столкнулся с этим сегодня, и кто-то из команды предложил: " Вы пробовали Нормально "?

Оказывается, он был прав.Следующее, кажется, приятно восстанавливает ваше окно:

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

Это прекрасно работает, восстанавливая окно в Maximized при необходимости.Кажется, крайне важно сначала проверить минимизированное состояние, так как вызов WindowState.Normal во второй раз "вернет" ваше окно в его максимизированное состояние.

Надеюсь, это поможет.

14 голосов
/ 04 апреля 2011

WPF считает, что это особенность ОС. Если вы хотите возиться с функциями ОС, вам, возможно, придется испачкать руки. К счастью, они предоставили нам инструменты для этого. Вот метод UN-Minim, который принимает окно 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,
    }
}
10 голосов
/ 25 июля 2015

SystemCommands класс имеет статический метод с именем RestoreWindow , который восстанавливает окно до предыдущего состояния.

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

[Примечание: SystemCommands класс является частью .NET 4.5+ (ссылка MSDN) , для проектов, нацеленных на более ранние версии Framework, можно использовать расширение оболочки WPF (ссылка MSDN) ]

4 голосов
/ 12 декабря 2015

По какой-то причине

WindowState = WindowState.Normal;

у меня не сработало.Поэтому я использовал следующий код, и он работал ..

 Show();
 WindowState = WindowState.Normal;
3 голосов
/ 03 апреля 2011

Вот как я могу восстановить его прямо сейчас: я обрабатываю событие 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;
1 голос
/ 16 апреля 2013

Хммм, принятый ответ у меня не сработал.Окно «развернуто», когда вызывается из панели задач, в конечном итоге самоцентрируется (отображается в нормальном размере, даже если его состояние развернуто) на экране, и такие вещи, как перетаскивание окна за строку заголовка, в итоге не работают.В конце концов (в значительной степени методом проб и ошибок) я понял, как это сделать.Спасибо @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;
}
0 голосов
/ 03 апреля 2011

В родной Windows вы можете восстановить ваше окно до предыдущего состояния с помощью <a href="http://msdn.microsoft.com/en-us/library/ms633548.aspx" rel="nofollow">ShowWindow</a>(SW_RESTORE):

Активирует и отображает окно.Если окно свернуто или развернуто, система восстанавливает его исходный размер и положение.Приложение должно указывать этот флаг при восстановлении свернутого окна.

. Безусловно, аналог .Net есть.

...