¿Cómo obtener el tamaño de la pantalla actual en WPF?

Sé que puedo obtener el tamaño de la pantalla principal mediante el uso de

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

¿Pero cómo obtengo el tamaño de la pantalla actual? (Los usuarios de pantallas múltiples no siempre usan la pantalla principal y no todas las pantallas usan la misma resolución, ¿verdad?)

Sería bueno poder acceder al tamaño desde XAML, pero hacerlo desde el código (C #) sería suficiente.

Hasta donde sé, no hay una función nativa de WPF para obtener las dimensiones del monitor actual. En su lugar, puede invocar funciones nativas de monitores de visualización múltiple , envolverlas en clases administradas y exponer todas las propiedades que necesite para consumirlas de XAML.

Creé una pequeña envoltura alrededor de la pantalla desde System.Windows.Forms, actualmente todo funciona … No estoy seguro acerca de los “píxeles independientes del dispositivo”.

 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; } } } 

Aquí budy. Esto le dará solo el ancho y la altura del área de trabajo

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

Tómese el tiempo para escanear a través de los miembros de SystemParameters.

  • VirtualScreenWidth
  • VirtualScreenHeight

Estos incluso tienen en cuenta las posiciones relativas de las pantallas.

Solo probado con dos monitores.

Esto le dará la pantalla actual basada en la esquina superior izquierda de la ventana. Simplemente llame a this.CurrentScreen () para obtener información sobre la pantalla actual.

 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)); } } } 

Si está familiarizado con el uso de la clase System.Windows.Forms , puede simplemente agregar una referencia de la clase System.Windows.Forms a su proyecto:

Explorador de soluciones -> Referencias -> Agregar referencias … -> (Ensambles: Marco) -> desplácese hacia abajo y marque System.Windows.Forms assembly -> OK .

Ahora puede agregar usando System.Windows.Forms; statement y pantalla de uso en su proyecto wpf al igual que antes.

¿Por qué no usar esto?

 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; 

Funciona con

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

Probado en 2 monitores.