2011-02-08 2 views
9

В основном я хочу, чтобы мое окно WPF переходило в полноэкранный режим, когда нажата кнопка F11 или нажата кнопка максимизации в правом верхнем углу окна.WPF full screen on maximize

Хотя следующие работы как шарм для прессования 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); 
} 

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

ответ

18

WPF, похоже, принимает решение abo независимо от того, следует ли выполнять полноэкранный режим или уважать панель задач на основе 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); 
} 

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

+5

* стук стук * - Кто там? - Семафор от '70. Хороший, хотя, он работает. +1 –

+0

Это хорошо работает. Даже он уродливый, он чувствует себя еще лучше, чем внедрение «WindowInteropHelper» или импорт некоторых dll для чего-то основного, как полноэкранный. Я должен думать об этом, вообще хорошая идея! –

+1

На самом деле это создает уродливый видимый эффект в Window XP, потому что оба изменения WindowState имеют визуальное представление в Windows XP, которое является синим заголовком, поднимающимся и опускающимся, и придает этому призыву пьяное окно. – cprcrack

3

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

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

Проверить этот блог Maximizing window (with WindowStyle=None) considering Taskbar

+0

Я пробовал 'Topmost = true;' и это не изменит поведение. –

+0

Является ли ваша панель задач «самой популярной»? Он работает здесь. –

+0

Глупый вопрос. Как я могу проверить, установлена ​​ли моя панель задач «сверху самой». Как я уже сказал, он отлично работает (с и без «Topmost»), нажимая F11. –

0

Вы можете скрыть панель задач, если импортировать 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); 
+5

Вы только что уничтожили мою панель задач! –

+0

Вы должны вызвать ShowWindow (hwnd, SW_SHOW) при выходе из полноэкранного режима ... –

+0

Спасибо kzen! Во всяком случае, мне это не понравилось WPF. Но это может быть вариант. –

0

Я нашел простой способ достижения в полноэкранном режиме в 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

Этот способ не работает, когда вы запускаете программу на машине с двумя экранами, потому что программа всегда максимизируется на левом экране. –

3

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

Вы можете установить свойство MaxHeight этого окна в SystemParameters.MaximizedPrimaryScreenHeight с помощью конструктора.

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

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

Источник:Maximize window with WindowState Problem (application will hide windows taskbar)

2

попробовать это

Topmost="True" and WindowState="Maximized" 

вы можете увидеть окно будет покрывать весь экран и скрыть все с окнами задач

+0

Работала лучше, чем любая другая в Windows 10! (Anniversary update) –

1

Если есть еще кто-то, что нужно гладкая полный экран, конечно, проверен только на окнах 10! В Windows 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

Спасибо, отлично работает на Windows XP и Windows 7. – dbostream

+0

Проблема с этим ответом заключается в том, что он использует событие MouseDoubleClick, а вопрос спрашивает, как изменить поведение кнопки Maximize. Хотя это будет работать, было бы лучше, если бы событие, используемое в этом примере, изменилось, так что оно рассмотрит вопрос. –

1

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

0

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

Visibility = Visibility.Collapsed; 
WindowStyle = WindowStyle.None; 
WindowState = WindowState.Maximized; 
ResizeMode = ResizeMode.NoResize; 
Visibility = Visibility.Visible;