Подтвердить что ты не робот

Как восстановить свернутое окно в коде?

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

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

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

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

4b9b3361

Ответ 1

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

Оказывается, он был прав. Кажется, что красиво восстанавливается ваше окно:

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Вот как я могу восстановить его прямо сейчас: я обрабатываю событие StateChanged, чтобы отслеживать последнее состояние, которое не было Minimized

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

Чтобы восстановить i, необходимо установить это значение WindowState соответственно:

this.WindowState = _lastNonMinimizedState;

Ответ 5

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

Ответ 6

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

WindowState = WindowState.Normal;

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

 Show();
 WindowState = WindowState.Normal;

Ответ 7

В родной Windows вы можете восстановить свое окно в предыдущее состояние с помощью ShowWindow(SW_RESTORE):

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

Несомненно .Net тоже.

Ответ 8

Будьте осторожны при попытке восстановления после минимизации. Я просто справился с проблемой, когда установка WindowState обратно в Normal не восстанавливала Window, как ожидалось. Проблема заключалась в изменении свойства Видимость (на свертывание) после минимизации и перед тем, как вернуть его в нормальное состояние.