Как восстановить свернутое окно в коде?
Это вопрос простой, но мне кажется, что нет встроенного метода для него в WPF. Кажется, что свойство WindowState
, которое является перечислением, не помогает, так как я не могу определить, было ли Окно в состоянии Normal
или Maximized
до сверления.
При нажатии значка на панели задач окно восстанавливается так, как ожидалось, при условии его предыдущего состояния, но я не могу найти какой-либо определенный метод, который делает это.
Итак, мне было интересно, я просто что-то упустил или мне нужно использовать какую-то пользовательскую логику взаимодействия.
(я отправлю свое текущее решение в качестве ответа)
Ответы
Ответ 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, как ожидалось. Проблема заключалась в изменении свойства Видимость (на свертывание) после минимизации и перед тем, как вернуть его в нормальное состояние.