Как получить размер текущего экрана в WPF?

Я знаю, что могу получить размер основного экрана, используя

System.Windows.SystemParameters.PrimaryScreenWidth; System.Windows.SystemParameters.PrimaryScreenHeight; 

Но как мне получить размер текущего экрана? (Многоэкранные пользователи не всегда используют основной экран, а не все экраны используют одинаковое разрешение, верно?)

Было бы неплохо иметь доступ к размеру из XAML, но этого достаточно для кода (C #).

Насколько я знаю, нет встроенной функции WPF для получения размеров текущего монитора. Вместо этого вы можете использовать функции отображения нескольких мониторов PInvoke, обернуть их в управляемый class и выставить все свойства, необходимые для их использования в XAML.

Я создал небольшую обертку вокруг экрана из System.Windows.Forms, в настоящее время все работает … Однако не уверены в «независимых от устройства пикселей».

 public class WpfScreen { public static IEnumerable AllScreens() { foreach (Screen screen in System.Windows.Forms.Screen.AllScreens) { yield return new WpfScreen(screen); } } public static WpfScreen GetScreenFrom(Window window) { WindowInteropHelper windowInteropHelper = new WindowInteropHelper(window); Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle); WpfScreen wpfScreen = new WpfScreen(screen); return wpfScreen; } public static WpfScreen GetScreenFrom(Point point) { int x = (int) Math.Round(point.X); int y = (int) Math.Round(point.Y); // are x,y device-independent-pixels ?? System.Drawing.Point drawingPoint = new System.Drawing.Point(x, y); Screen screen = System.Windows.Forms.Screen.FromPoint(drawingPoint); WpfScreen wpfScreen = new WpfScreen(screen); return wpfScreen; } public static WpfScreen Primary { get { return new WpfScreen(System.Windows.Forms.Screen.PrimaryScreen); } } private readonly Screen screen; internal WpfScreen(System.Windows.Forms.Screen screen) { this.screen = screen; } public Rect DeviceBounds { get { return this.GetRect(this.screen.Bounds); } } public Rect WorkingArea { get { return this.GetRect(this.screen.WorkingArea); } } private Rect GetRect(Rectangle value) { // should x, y, width, height be device-independent-pixels ?? return new Rect { X = value.X, Y = value.Y, Width = value.Width, Height = value.Height }; } public bool IsPrimary { get { return this.screen.Primary; } } public string DeviceName { get { return this.screen.DeviceName; } } } 

Здесь застенчивый. Это даст вам только ширину и высоту рабочей области

 System.Windows.SystemParameters.WorkArea.Width System.Windows.SystemParameters.WorkArea.Height 

Найдите время для сканирования через элементы SystemParameters.

  • VirtualScreenWidth
  • VirtualScreenHeight

Они даже учитывают относительные положения экранов.

Испытано только с двумя мониторами.

Это даст вам текущий экран, основанный на левом верхнем углу windows, просто вызовите this.CurrentScreen (), чтобы получить информацию о текущем экране.

 using System.Windows; using System.Windows.Forms; namespace Common.Helpers { public static class WindowHelpers { public static Screen CurrentScreen(this Window window) { return Screen.FromPoint(new System.Drawing.Point((int)window.Left,(int)window.Top)); } } } 

Если вы знакомы с использованием classа System.Windows.Forms, вы можете просто добавить ссылку на class System.Windows.Forms в свой проект:

Обозреватель решений -> Ссылки -> Добавить ссылки … -> (Ассемблирования: Framework) -> прокрутите вниз и проверьте сборку System.Windows.Forms -> OK .

Теперь вы можете добавить с помощью System.Windows.Forms; оператора и экрана использования в вашем проекте wpf, как и раньше.

Почему бы просто не использовать это?

 var interopHelper = new WindowInteropHelper(System.Windows.Application.Current.MainWindow); var activeScreen = Screen.FromHandle(interopHelper.Handle); 
 double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double screenhight= System.Windows.SystemParameters.PrimaryScreenHeight; 

Он работает с

 this.Width = System.Windows.SystemParameters.VirtualScreenWidth; this.Height = System.Windows.SystemParameters.VirtualScreenHeight; 

Протестировано на 2 мониторах.

  • Xamarin Forms Swipe Left / Swift Right Gestures
  • Как сделать режим родственных источников найти предок (или эквивалент) в UWP
  • Привязка отображает состояние в режиме просмотра MVVM?
  • Переключение UWP в Style Setter не работает
  • Как связать WPF DataGrid с переменным числом столбцов?
  • WPF: слайдер с событием, которое запускается после того, как пользователь перетаскивает
  • Применение инсульта к текстовому блоку в WPF
  • WPF: привязка ContextMenu к команде MVVM
  • Почему избежать кода в шаблоне MVVM WPF?
  • Ошибка WPF 40 Ошибка BindingExpression path: свойство не найдено в 'объекте'
  • Как добавить поведение Blend в стильном сеттере
  • Interesting Posts

    Что такое блокировка и концепция Re-entrant в целом?

    OpenCV Orb не находит совпадений после введения инвариантов вращения / масштаба

    Нанесение внешней тени при рисовании изображения

    Как я могу суммировать значения в столбце на основе значения в другом столбце?

    Эквивалент Try-with-resources в Java 1.6

    Можно ли использовать только принтер между двумя различными сетями? – Отсутствие доступа к ПК

    В чем разница между 127.0.0.1 и localhost

    Имеет ли время исполнения Android ART те же ограничения, что и Dalvik?

    Что такое lambda-выражение в C ++ 11?

    Удаление среднего узла из одного связанного списка, когда указатель на предыдущий узел недоступен

    EF Core Mapping EntityTypeConfiguration

    В чем разница между синхронизацией на lockObject и использованием этого как блокировки?

    «Разрешить этому устройству разбудить компьютер» отключено

    Как вставить строку разделителя писем в Outlook

    Как работает оператор сравнения с нулевым int?

    Давайте будем гением компьютера.