如何获取WPF中当前屏幕的大小?

我知道我可以通过使用获取主屏幕的大小

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

但是,我如何获得当前屏幕的大小? (多屏用户不总是使用主屏幕,并不是所有的屏幕都使用相同的分辨率,对吧?)

能够从XAML访问大小将是很好的,但是从代码(C#)来完成就足够了。

据我所知,没有本地的WPF函数来获取当前监视器的维度。 相反,你可以调用本地多显示监视器function ,将它们包装在托pipe类中,并公开从XAML中使用它们所需的所有属性。

我从System.Windows.Forms创build了一个围绕屏幕的小包装器,目前一切正常……不过不知道“设备独立像素”。

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

这里budy。 这将只给你工作区的宽度和高度

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

花些时间来扫描SystemParameters成员。

  • VirtualScreenWidth
  • VirtualScreenHeight

这些甚至考虑了屏幕的相对位置。

只用两台显示器进行testing。

这会给你基于窗口左上angular的当前屏幕只需调用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)); } } } 

为什么不使用这个?

 var interopHelper = new WindowInteropHelper(System.Windows.Application.Current.MainWindow); var activeScreen = Screen.FromHandle(interopHelper.Handle); 

如果您熟悉使用System.Windows.Forms类,那么您可以 System.Windows.Forms类的引用添加到您的项目中:

解决scheme资源pipe理器 – > 引用 – > 添加引用… – > (Assemblies:Framework) – >向下滚动并检查System.Windows.Forms程序集 – > 确定

现在你可以添加使用System.Windows.Forms; 声明和使用屏幕在你的wpf项目就像以前一样。

 double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double screenhight= System.Windows.SystemParameters.PrimaryScreenHeight; 

它适用于

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

testing2台显示器。