如何获取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台显示器。