2009-09-23 1 views
17

Я хочу добиться того же эффекта, что и проигрыватели Windows Media Player или браузеры на базе Flash, которые занимают ПОЛНОЕ (даже панель задач не видна) недвижимости при максимальном увеличении.Окно WPF со стилем = None закрывает панель задач, когда Максимизировано после инициализации приложения

Это прекрасно работает, если WindowState установлен в Maximized и WindowStyle установлен в None в XAML, так что приложение запускается в таком состоянии. Проблема в том, что я хочу запустить приложение в ограниченном окне и, когда пользователь выбирает, максимизировать, как указано выше. В обработчике StateChanged я проверяю состояние Maximized, и если это так, я устанавливаю WindowStyle в None. Это приводит к максимизации окна, но НЕ закрывает панель задач. Следующий код будет делать эту работу, как я хочу, но хак, и я хотел бы, чтобы очистить его:

if (WindowState == WindowState.Maximized) 
{ 
    m_videoWindow.Maximize(); 

    WindowStyle = WindowStyle.None; 

    //the following makes this work but I would like to clean it up 
    Hide(); 
    Show(); 
} 

EDITThis (с 2006 года, когда еще в CTP) упоминает проблему и кто-то из MS заявляет, что они надеются улучшить полноэкранную поддержку в следующей версии, были ли эти улучшения сделаны?

+0

Эта проблема все еще жива и хороша со всеми последними версиями WPF/.NET 4.0 ... - Думаю, Microsoft хотела, чтобы эта ошибка была обратной совместимость ... ваше исправление для скрытия/показа прекрасно работает, хотя ... Я делаю свое немного иначе, называя Скрыть, устанавливая свойства, а затем вызываю Show. – BrainSlugs83

+0

Ну, черт побери. Я заметил, что некоторые из моих элементов управления не изменяются правильно, не знаю, почему (с моим заказом или с вашим заказом ...); Быстрое решение было для Maximize, вызвать DoEvents(), установить WindowStyle в None, а затем вызвать Hide & Show. - DoEvents - это, конечно, System.Windows.Forms.Application.DoEvents() (Да, я знаю, что это безумие и, вероятно, худшая практика, но она работает ...) – BrainSlugs83

ответ

13

В этой статье объясняется все: Maximizing window (with WindowStyle=None) considering Taskbar.

Также стоит проверить: Custom Window Chrome in WPF.

Edit: Теперь новые, является Shell Integration Library WPF, что позволяет полностью перестилю оконного хрома без головной боли реализовав перемещения, изменения размеров и т.д.

Edit 2015: Shell Integration Library теперь интегрированный в WPF и MS удалил код

+0

Спасибо Эдуардо. Я читал это, но надеялся, что есть решение, которое не требует Win32. Я уверен, что должно быть что-то, так как хак, о котором я упоминаю выше, работает ... –

+0

Я предполагаю, что нет, потому что поведение по дизайну, поэтому у вас может быть окно, которое занимает весь рабочий стол, например, BabySmash. –

+1

Не странно ли это, что при первоначальной загрузке окна с WindowStyle = Нет и WindowState = Максимизировано, панель задач закрыта, но при максимизации окна после его загрузки это не так? –

1

Я не знаю, подходит ли это для вас, но вы можете изменить размер окна с тем же размером, что и рабочая область (то есть, в большинстве случаев, весь экран кроме панели задач) и найдите его в 0,0 (верхний левый угол):

Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; 
Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; 
Left = 0; 
Top = 0; 

Точное определение для свойства WorkingArea (из MSDN) является:

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

Надеется, что это помогает

+0

Что делать, если панель задач находится сверху? Или у вас есть несколько мониторов? –

+0

В этом случае это не будет работать должным образом. – Fix

+0

Да, у меня была такая же идея, но я пришел к тому же возражению. Жаль, что не просто запросить, какой монитор работает, и получить точный RECT для этого монитора ... есть, вероятно, какой-то вызов interop для этого, но винт ... – BrainSlugs83

2

Чтобы получить эту работу должным образом в моем приложении WPF/.NET 4.0 Я вызываю эту функцию каждый раз, когда я вхожу или выйти из полноэкранного режима:

private static void RefreshWindowVisibility(Window window) 
     { 
      if (window.OriginalWindowState == WindowState.Maximized) 
      { 
       window.Hide(); 
       window.Show(); 
       window.BringIntoView(); 
      } 
     } 

Существует мелькание связанный с этим методом, но, похоже, такой же мерцание существует при переходе в полноэкранный режим в Chrome. Кажется, что Internet Explorer использует другой подход.

2

Я обнаружил, что могу максимизировать до полного экрана (охватывая панель задач), задав свойства при создании окна (в xaml), но не смог переключиться туда и обратно после создания. После некоторого экспериментирования, я обнаружил, что порядок свойства устанавливаются кажется, имеет значение:

public bool IsFullscreen 
{ 
    get 
    { 
     return WindowState == System.Windows.WindowState.Maximized 
      && ResizeMode == System.Windows.ResizeMode.NoResize 
      && WindowStyle== System.Windows.WindowStyle.None; 
    } 
    set 
    { 
     if (value) 
     { 
      ResizeMode = System.Windows.ResizeMode.NoResize; 
      WindowStyle = System.Windows.WindowStyle.None; 
      WindowState = System.Windows.WindowState.Maximized; 
     } 
     else 
     { 
      ResizeMode = System.Windows.ResizeMode.CanResize; 
      WindowStyle = System.Windows.WindowStyle.SingleBorderWindow; 
      WindowState = System.Windows.WindowState.Normal;    
     } 
    } 
} 

Обратите внимание, что WindowState приходит последний в инкубаторе.