2015-01-19 3 views
1

Как добавить динамическую возможность переключения с полноэкранного режима в оконный режим и наоборот на Mahapps MetroWindow?FullscreenBehaviour for Mahapps

Начиная с обычным окном

Initially windowed state

и после переключения в полноэкранном режиме верхних кнопок правого окна (Свернуть/Развернуть/Закрыть) все еще видны (но они не должны быть видны, а в качестве названия бар). Зарезервированное пространство для заголовка кажется все еще там.

Buttons still visible after switching to fullscreen

Другой путь круглый первоначально из полноэкранного состояния (нет кнопки, кроме кнопки Hello в середине и не заголовка => как и ожидалось)

enter image description here

... но при возврате в нормальное состояние окна заголовок возвращается снова, но верхние левые кнопки отсутствуют.

enter image description here

я делаю что-то здесь не так в коде? Я использовал страшное поведение. Интересная часть, которая выполняется при переключении заключается в следующем:

private static void OnIsFullscreenChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var window = (MetroWindow)sender; 

     var oldValue = (bool)e.OldValue; 
     var newValue = (bool)e.NewValue; 

     if (newValue == oldValue || window == null) 
     { 
      return; 
     } 

     if (newValue) 
     { 
      window.Tag = window.WindowState; 

      window.Topmost = true; 

      window.UseNoneWindowStyle = true; 
      window.IgnoreTaskbarOnMaximize = true; 
      window.ShowTitleBar = false; 

      window.WindowStyle = WindowStyle.None; 
      window.WindowState = WindowState.Maximized; 
     } 
     else 
     { 
      window.Topmost = false; 

      window.UseNoneWindowStyle = false; 
      window.IgnoreTaskbarOnMaximize = false; 
      window.ShowTitleBar = true; 

      window.WindowStyle = WindowStyle.SingleBorderWindow; 
      window.WindowState = (WindowState)window.Tag; 
     } 
    } 

Прикрепление Двойники Поведение в окно по умолчанию WPF контролировать все работает, как ожидалось.

Я придаю Поведение так:

<controls:MetroWindow ... local:FullscreenBehavior.IsFullscreen="{Binding Fullscreen}"> 
<!-- code above sets initial state depending on ViewModel value --> 
<!-- code below fires mode switching when a defined key is pressed => executes OnIsFullscreenChanged method --> 
    <i:Interaction.Behaviors> 
     <behaviours:BorderlessWindowBehavior /> 
     <behaviours:WindowsSettingBehaviour /> 
     <behaviours:GlowWindowBehavior /> 
     <modern:FullscreenBehavior FullscreenKey="{Binding FullscreenKey}" />  
    </i:Interaction.Behaviors> 
    ... 

EDIT: Установите состояние окна кнопок явно Когда я расширяю метод, чтобы установить состояния на правильное значение явно, как представляется, еще один странный эффект :

private static void OnIsFullscreenChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var window = (MetroWindow)sender; 

     var oldValue = (bool)e.OldValue; 
     var newValue = (bool)e.NewValue; 

     if (newValue == oldValue || window == null) 
     { 
      return; 
     } 

     if (newValue) 
     { 
      window.Tag = window.WindowState; 

      window.Topmost = true; 

      window.UseNoneWindowStyle = true; 
      window.IgnoreTaskbarOnMaximize = true; 
      window.ShowTitleBar = false; 
      window.ShowCloseButton = false; 
      window.ShowMaxRestoreButton = false; 
      window.ShowMinButton = false; 

      window.WindowStyle = WindowStyle.None; 
      window.WindowState = WindowState.Maximized; 
     } 
     else 
     { 
      window.Topmost = false; 

      window.UseNoneWindowStyle = false; 
      window.IgnoreTaskbarOnMaximize = false; 
      window.ShowTitleBar = true; 
      window.ShowCloseButton = true; 
      window.ShowMaxRestoreButton = true; 
      window.ShowMinButton = true; 

      window.ShowCloseButton = true; 
      window.ShowMaxRestoreButton = true; 
      window.WindowStyle = WindowStyle.SingleBorderWindow; 
      window.WindowState = (WindowState)window.Tag; 
     } 
    } 

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

enter image description here

+0

Какова ценность ShowCloseButton, ShowMaxRestoreButton, свойств ShowMinButton? –

+0

@FDL: Я не задал их явно. Как видите, они отображаются, если я начинаю с обычного окна, но при запуске с полноэкранного режима они скрыты. – Beachwalker

+0

@FDL: Если я установил их в false/hidden ... это также удалит пространство для заголовка? – Beachwalker

ответ

4

Существует небольшая ошибка в текущей версии 1.0. Если вы переключаете UseNoneWindowStyle, он не возвращает кнопки и панель инструментов. Я исправлю это как можно скорее.

Итак, вот немного обходного пути для вас.

public static readonly DependencyProperty ToggleFullScreenProperty = 
    DependencyProperty.Register("ToggleFullScreen", 
           typeof(bool), 
           typeof(MainWindow), 
           new PropertyMetadata(default(bool), ToggleFullScreenPropertyChangedCallback)); 

private static void ToggleFullScreenPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    var metroWindow = (MetroWindow)dependencyObject; 
    if (e.OldValue != e.NewValue) 
    { 
     var fullScreen = (bool)e.NewValue; 
     if (fullScreen) 
     { 
      metroWindow.UseNoneWindowStyle = true; 
      metroWindow.IgnoreTaskbarOnMaximize = true; 
      metroWindow.ShowMinButton = false; 
      metroWindow.ShowMaxRestoreButton = false; 
      metroWindow.ShowCloseButton = false; 
      metroWindow.WindowState = WindowState.Maximized; 
     } 
     else 
     { 
      metroWindow.UseNoneWindowStyle = false; 
      metroWindow.ShowTitleBar = true; // <-- this must be set to true 
      metroWindow.IgnoreTaskbarOnMaximize = false; 
      metroWindow.ShowMinButton = true; 
      metroWindow.ShowMaxRestoreButton = true; 
      metroWindow.ShowCloseButton = true; 
      metroWindow.WindowState = WindowState.Normal; 
     } 
    } 
} 

public bool ToggleFullScreen 
{ 
    get { return (bool)GetValue(ToggleFullScreenProperty); } 
    set { SetValue(ToggleFullScreenProperty, value); } 
} 

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

+0

, это решение работает. спасибо – Beachwalker

Смежные вопросы