C#WPF的多屏显示问题(完善版)

本文详细讨论了C# WPF应用在多屏显示时遇到的问题,包括窗口位置不正确、显示器序号对应混乱以及窗口跨屏显示等。通过分析问题原因,提出了解决方案,包括正确设置显示器布局、在窗口加载后最大化、使用Bounds获取屏幕显示范围等关键步骤,以确保窗口能按预期在各显示器上正确显示。

之前就做过这个多屏显示的问题,但是这几天在现场的时候还是会出现问题。 

出现的问题主要是:

一、窗口不用对应的显示在所希望的显示器上。比如希望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]);
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值