Полный экран WPF на максимизации - PullRequest
9 голосов
/ 09 февраля 2011

Я хочу, чтобы мое окно WPF работало в полноэкранном режиме, когда нажата клавиша F11 или нажата кнопка максимизации в правом верхнем углу окна.

Хотя следующее работает как чудодля нажатия клавиши F11:

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.F11)
    {
        WindowStyle = WindowStyle.None;
        WindowState = WindowState.Maximized;
        ResizeMode = ResizeMode.NoResize;
    }
}

По-прежнему будет отображаться панель задач Windows (протестировано с Windows 7):

protected override void OnStateChanged(EventArgs e)
{
    if (WindowState == WindowState.Maximized)
    {
        WindowStyle = WindowStyle.None;
        WindowState = WindowState.Maximized;
        ResizeMode = ResizeMode.NoResize;
    }
    base.OnStateChanged(e);
}

Что мне здесь не хватает?Или я могу сделать это еще элегантнее?

Ответы [ 9 ]

19 голосов
/ 09 февраля 2011

WPF, похоже, принимает решение о том, переходить ли в полноэкранный режим или соблюдать панель задач на основе WindowStyle во время максимизации. Таким образом, грязное, но эффективное решение состоит в том, чтобы переключить окно обратно в не максимизированное, установить WindowStyle, а затем снова установить окно в максимизированное:

private bool _inStateChange;

protected override void OnStateChanged(EventArgs e)
{
  if (WindowState == WindowState.Maximized && !_inStateChange)
  {
    _inStateChange = true;
    WindowState = WindowState.Normal;
    WindowStyle = WindowStyle.None;
    WindowState = WindowState.Maximized;
    ResizeMode = ResizeMode.NoResize;
    _inStateChange = false;
  }
  base.OnStateChanged(e);
}

Хотя код явно некрасив, переход к нормальному, а затем к максимизированному, кажется, не ухудшает восприятие пользователем. На моем дисплее я заметил мерцание и с кодом F11, и с максимизацией клуджа, но заметно не хуже при максимизации клуджа. Но ваш пробег может отличаться!

3 голосов
/ 26 апреля 2013

Другое решение, которое сработало для меня:

Можно установить для свойства MaxHeight этого окна значение SystemParameters.MaximizedPrimaryScreenHeight с помощью конструктора.

public MainWindow()
{
    InitializeComponent();
    this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
}

Предупреждение: Это может не работать на расширенном рабочем столе.

Источник: Развернуть окно с помощью WindowState Problem (приложение скроет панель задач Windows)

3 голосов
/ 09 февраля 2011

Вам необходимо установить свойство Window.Topmost .

Редактировать

Проверьте это сообщение в блоге Окно максимизации (с WindowStyle = Нет) с учетом панели задач

2 голосов
/ 16 сентября 2016

Если вы используете WindowChrome для создания пользовательского интерфейса Chrome, вам нужно установить GlassFrameThickness на значение, отличное от 0 (по крайней мере, это было последним Мне нужно было сделать, чтобы панель задач была скрыта за окном). Это в дополнение к шагам, указанным в принятом ответе.

2 голосов
/ 13 сентября 2014

попробуйте

Topmost="True" and WindowState="Maximized"

вы можете видеть, что ваше окно будет закрывать весь экран и скрывать все с помощью панели задач Windows

1 голос
/ 20 августа 2015

Если есть еще кто-то, кому нужен плавный полноэкранный режим, конечно, протестированный только на Windows 10! В свернутых окнах 10 делайте меньше мерцания, если сохраняете этот порядок кода!

    public bool IsFullscreen = false;
    public WindowState lastWindowState;
    private void player_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (IsFullscreen)
        {
            this.WindowStyle = WindowStyle.SingleBorderWindow;
            this.WindowState = lastWindowState;
            IsFullscreen = false;

        }
        else
        {
            lastWindowState = this.WindowState;

            this.WindowStyle = WindowStyle.None;
            if (this.WindowState == WindowState.Maximized)
                this.WindowState = WindowState.Minimized;
            this.WindowState = WindowState.Maximized;
            IsFullscreen = true;
        }
    }
0 голосов
/ 20 июня 2017

В моем случае, минимизация и максимизация приведут к тому, что полноэкранный размер будет немного больше размера экрана, поэтому я нашел альтернативу - временно установить Visibility в Collapsed, а затем обратно в Visible, чтобы вызвать перерисовку.

Visibility = Visibility.Collapsed;
WindowStyle = WindowStyle.None;
WindowState = WindowState.Maximized;
ResizeMode = ResizeMode.NoResize;
Visibility = Visibility.Visible;
0 голосов
/ 21 февраля 2013

Я нашел простой способ достижения полноэкранного режима в WPF:

    private double LastHeight, LastWidth;
    private System.Windows.WindowState LastState;

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.F11)
        {
            if (WindowStyle != WindowStyle.None)
            {
                LastHeight = Height;
                LastWidth = Width;
                LastState = WindowState;

                Topmost = true;
                Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
                Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
                Top = 0;
                Left = 0;
                WindowState = System.Windows.WindowState.Normal;
                WindowStyle = WindowStyle.None;
                ResizeMode = System.Windows.ResizeMode.NoResize;
            }
            else
            {
                WindowStyle = WindowStyle.SingleBorderWindow;
                WindowState = LastState; ;
                ResizeMode = ResizeMode.CanResizeWithGrip;
                Topmost = false;
                Width = LastWidth;
                Height = LastHeight;
            }
        }
    }

Это хорошо работает в Windows 7 с фиксированной панелью задач.

0 голосов
/ 09 февраля 2011

Вы можете скрыть панель задач, если импортируете user32.dll ...

[DllImport("user32.dll")]
private static extern int FindWindow(string className, string windowText);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int command);

private const int SW_HIDE = 0;
private const int SW_SHOW = 1;

Использование:

int hwnd = FindWindow("Shell_TrayWnd","");
ShowWindow(hwnd,SW_HIDE);
...