2009-09-08 3 views
6

Я знаю, что WPF имеет значение «CenterScreen» для центрирования окна на рабочем столе. Однако на двойном мониторе это не очень приятно.Wpf - центрирование на основном рабочем столе

Как я могу сосредоточиться на основном мониторе? Нужно ли мне проходить через песню и танцевать обнаружение основного рабочего стола, получить его геометрию и т. Д., Или есть лучший способ?

+0

+1, хороший вопрос. Мы также должны были работать с wpf через Citrix и сражаться с центрированием/максимизацией wpf и проблемами Citrixes! :) – Russell

ответ

5

Несколько экранов - это немного проблема, и у нее нет встроенного, хорошо отбитого способа справиться с ними, но с некоторыми математиками и SystemParameters вы можете это сделать.

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

this.Left = (SystemParameters.PrimaryScreenWidth/2) - (this.ActualWidth/2); 
this.Top = (SystemParameters.PrimaryScreenHeight/2) - (this.ActualHeight/2); 

Основная идея не просто достаточно, чтобы объяснять не надо.

Этот код предназначен для C#, но я уверен, что у VB есть нечто подобное.

Также обратите внимание, что вы должны использовать свойство ActualWidth \ ActualHeight, а не свойство Width \ Height, поскольку оно может содержать значение NaN.

Удачи.

+0

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

0

У нас была та же проблема. К сожалению, после многократного обсуждения с TA и клиентом было принято решение повысить ценность (с точки зрения денег и времени), чтобы максимизировать его на основном мониторе.

0

Использование SystemParameters.WorkArea. Это дает вам часть основного монитора, который не обрабатывается панель задач, что должно дать вам более хорошее центрирование.

0

Это мое чисто WPF-решение для центрирования окна на основном мониторе с границей пустого пространства вокруг него (потому что я не хочу, чтобы оно было максимально). Моя установка - квадратный монитор слева от меня и широкоэкранный справа от меня. Это было протестировано с каждым монитором, установленным в качестве основного монитора в Windows.

Прежде чем перейти к этому решению, на System.Windows.SystemParameters есть три полезных свойства, которые дают разные высоты. Цифры приведены для моего широкоформатного экрана 1920x1080.

  • PrimaryScreenHeight - 1080. Фактическая высота разрешения устанавливается в Windows.
  • WorkArea.Height - 1040. Фактическая высота разрешение минус Start Bar
  • FullPrimaryScreenHeight - 1018. Фактическое разрешение минус Start Bar и минус заголовок окна.

Это мое решение, и я использую WorkArea.Height:

protected T SetWindowLocation<T>(T window) where T : Window 
    { 
     //This function will set a window to appear in the center of the user's primary monitor. 
     //Size will be set dynamically based on resoulution but will not shrink below a certain size nor grow above a certain size 

     //Desired size constraints. Makes sure window isn't too small if the users monitor doesn't meet the minimum, but also not too big on large monitors 
     //Min: 1024w x 768h 
     //Max: 1400w x 900h 

     const int absoluteMinWidth = 1024; 
     const int absoluteMinHeight = 768; 
     const int absoluteMaxWidth = 1400; 
     const int absoluteMaxHeight = 900; 

     var maxHeightForMonitor = System.Windows.SystemParameters.WorkArea.Height - 100; 
     var maxWidthForMonitor = System.Windows.SystemParameters.WorkArea.Width - 100; 

     var height = Math.Min(Math.Max(maxHeightForMonitor, absoluteMinHeight), absoluteMaxHeight); 
     var width = Math.Min(Math.Max(maxWidthForMonitor, absoluteMinWidth), absoluteMaxWidth); 

     window.Height = height; 
     window.Width = width; 
     window.Left = (System.Windows.SystemParameters.FullPrimaryScreenWidth - width)/2; 
     window.Top = (System.Windows.SystemParameters.FullPrimaryScreenHeight - height)/2; 
     window.WindowStartupLocation = WindowStartupLocation.Manual; 

     return window; 
    } 
Смежные вопросы