Как получить размер текущего экрана в WPF?
Я знаю, что могу получить размер основного экрана, используя
System.Windows.SystemParameters.PrimaryScreenWidth; System.Windows.SystemParameters.PrimaryScreenHeight;
Но как мне получить размер текущего экрана? (Многоэкранные пользователи не всегда используют основной экран, а не все экраны используют одинаковое разрешение, верно?)
Было бы неплохо иметь доступ к размеру из XAML, но этого достаточно для кода (C #).
- Как скрыть кнопку закрытия в окне WPF?
- Добавление объединенного словаря в объединенный словарь
- Как связать массив байтов с изображением в WPF с преобразователем значений?
- Пример использования гиперссылки в WPF
- Как вы привязываете CollectionContainer к коллекции в модели представления?
- В .NET 4.0 привязка OneWayToSource
- Windows Phone 8.1. Переключение видимости TextBlock в DataTemplate
- WPF DataGrid - кнопка в столбце, получающая строку, из которой она появилась в обработчике событий Click
- Ширина столбца DataGrid не обновляется автоматически
- Связывание RelativeSource с помощью ToolTip или ContextMenu
- Преобразование управления WPF (XAML) в документ XPS
- Как связать TextBlock с ресурсом, содержащим форматированный текст?
- Почему ActualWidth и ActualHeight 0.0 в этом случае?
Насколько я знаю, нет встроенной функции 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 мониторах.