Как получить размер текущего экрана в WPF?
Я знаю, что могу получить размер основного экрана с помощью
System.Windows.SystemParameters.PrimaryScreenWidth;
System.Windows.SystemParameters.PrimaryScreenHeight;
но как я могу получить размер текущего экрана? (Пользователи с несколькими экранами не всегда используют основной экран, и не все экраны используют одно и то же разрешение, верно?)
было бы неплохо иметь доступ к размеру из XAML, но этого было бы достаточно из кода (C#).
9 ответов:
насколько я знаю, нет собственной функции WPF для получения размеров текущего монитора. Вместо этого вы могли бы PInvoke native функции нескольких мониторов, оберните их в управляемый класс и предоставьте все свойства, необходимые для их использования из XAML.
Я создал небольшую обертку вокруг экрана из системы.Окна.Формы, в настоящее время все работает... Однако не уверен в "независимых от устройства пикселях".
public class WpfScreen { public static IEnumerable<WpfScreen> 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
Они даже принимают во внимание относительное положение экранов.
протестирован только с двумя мониторами.
Это даст вам текущий экран, основанный на верхнем левом углу окна просто вызовите это.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)); } } }
почему бы просто не использовать это?
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 мониторах.
Comments