之前就做过这个多屏显示的问题,但是这几天在现场的时候还是会出现问题。
出现的问题主要是:
一、窗口不用对应的显示在所希望的显示器上。比如希望1,2,3显示器分别显示窗口1,2,3.但实际上1,2窗口显示在1显示器上,2窗口显示在2显示上,而三显示器上并没有显示。
二、并不能按照顺序对应显示,会造成显示器序号和窗口序号不对应。
三、窗口的区域不对。有时候一个窗口会跨2个显示器显示,一个显示器中并不能完全显示整个窗口
之后再进行了一些资料的查阅和修改。
产生这些问题的原因。
1.WindowState的最大化不对,如果在窗口加载之前就把窗口最大化之后,则窗口也不能正确的显示到所希望的显示器。只能显示到主窗口
2.显示区域的范围选择不对。
对整个程序进行了一下的修改。并且进行一些显示器设置操作
首先如果需要用到Screen,这个类型就必须包含:
using System.Windows.Forms;这个语句,如果不成功请查阅相关的资料。
1.显示器设置操作:
这里用displayfusion对四个显示进行了设置,设置主显示器为第一个显示器,坐标从0,0开始,其他显示器一次紧贴紧跟在第一个显示器之后,并且把所有的显示Y坐标都定义为0;
读取显示列表后要根据X坐标的大小进行排序,使第一个显示器为主显示器。
List<System.Windows.Forms.Screen> screens = System.Windows.Forms.Screen.AllScreens.ToList();
screens.Sort((x, y) => x.Bounds.X.CompareTo(y.Bounds.X));
2.窗口最大化语句放入到窗口的加载函数中
再xaml界面中选中窗口,然后在属性窗口中添加loaded行为:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
}
在此函数中添加语句
WindowState = WindowState.Maximized;
每个窗口都需要进行这样操作,添加loaded函数,然后添加语句设置窗口最大化。
3.编写对应窗口对应显示器的display函数,屏幕的显示范围用Bounds来取值,而不是用之前的WorkingArea来取值。
Window window = _window as Window;
if (window != null)
{
//用workingarea显示区域会出错,按照显示的Bounds来显示需要的内容。
//另外需要用屏幕管理软件比如displayfusion来管理各个显示器的位置。
//设置各个显示的坐标位置,把所有显示的高度初始都标志位0;
window.Top = screen.Bounds.Top;
window.Left = screen.Bounds.Left;
window.Width = screen.Bounds.Width;
window.Height = screen.Bounds.Height;
//每个窗口都需要加载window_load函数,然后再window_load函数中定义窗口的最大化,不能在显示的时候进行
//最大化设置,不然窗口会现实回主显示器中。
window.Show();
}
4。显示功能的实现
//获取显示器的数量
List<System.Windows.Forms.Screen> screens = System.Windows.Forms.Screen.AllScreens.ToList();
screens.Sort((x, y) => x.Bounds.X.CompareTo(y.Bounds.X));
//对显示器的边界坐标进行排序,0最小的为主显示器,其他的显示按照中间,左边,右边挨个显示,
//如果获取到显示器数量为4个,则表示4个显示器打开了。主显示器也已经打开,则程序启动后直接显示主界面以外的3个显示器
//用workingarea显示区域会出错,按照显示的Bounds来显示需要的内容。
//另外需要用屏幕管理软件比如displayfusion来管理各个显示器的位置。
//设置各个显示的坐标位置,把所有显示的高度初始都标志位0;
Window1 window1 = new Window1();
Window2 window2 = new Window2();
if (screens.Count == 4)
{
Display(this, screens[1]);
Display(window1, screens[2]);
Display(window2, screens[3]);
}
else
{
if (screens.Count > 1)
Display(window1, screens[1]);
else
Display(window1, screens[0]);
if (screens.Count > 2)
Display(window2, screens[2]);
else
Display(window2, screens[0]);
}
本文详细讨论了C# WPF应用在多屏显示时遇到的问题,包括窗口位置不正确、显示器序号对应混乱以及窗口跨屏显示等。通过分析问题原因,提出了解决方案,包括正确设置显示器布局、在窗口加载后最大化、使用Bounds获取屏幕显示范围等关键步骤,以确保窗口能按预期在各显示器上正确显示。


&spm=1001.2101.3001.5002&articleId=130962284&d=1&t=3&u=7499fef94932461fbd1d56da0e8c0cb4)
428

被折叠的 条评论
为什么被折叠?



