0%

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

Excerpt

之前就做过这个多屏显示的问题,但是这几天在现场的时候还是会出现问题。  出现的问题主要是: 一、窗口不用对应的显示在所希望的显示器上。比如希望1,2…


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

出现的问题主要是:

一、窗口不用对应的显示在所希望的显示器上。比如希望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坐标的大小进行排序,使第一个显示器为主显示器。

1
2
<span>            </span><span>List</span><span>&lt;</span><span>System</span><span>.</span><span>Windows</span><span>.</span><span>Forms</span><span>.</span><span>Screen</span><span>&gt;</span><span> screens </span><span>=</span><span> </span><span>System</span><span>.</span><span>Windows</span><span>.</span><span>Forms</span><span>.</span><span>Screen</span><span>.</span><span>AllScreens</span><span>.</span><span>ToList</span><span>();</span><span>
screens</span><span>.</span><span>Sort</span><span>((</span><span>x</span><span>,</span><span> y</span><span>)</span><span> </span><span>=&gt;</span><span> x</span><span>.</span><span>Bounds</span><span>.</span><span>X</span><span>.</span><span>CompareTo</span><span>(</span><span>y</span><span>.</span><span>Bounds</span><span>.</span><span>X</span><span>));</span>

2.窗口最大化语句放入到窗口的加载函数中

再xaml界面中选中窗口,然后在属性窗口中添加loaded行为:

1
2
3
4
5
<span>    </span><span>private</span><span> </span><span>void</span><span> </span><span>Window_Loaded</span><span>(</span><span>object</span><span> sender</span><span>,</span><span> </span><span>RoutedEventArgs</span><span> e</span><span>)</span><span>
</span><span>{</span><span>
</span><span>}</span><span>

</span>

在此函数中添加语句

1
<span>            </span><span>WindowState</span><span> </span><span>=</span><span> </span><span>WindowState</span><span>.</span><span>Maximized</span><span>;</span>

每个窗口都需要进行这样操作,添加loaded函数,然后添加语句设置窗口最大化。

3.编写对应窗口对应显示器的display函数,屏幕的显示范围用Bounds来取值,而不是用之前的WorkingArea来取值。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span>            </span><span>Window</span><span> window </span><span>=</span><span> _window </span><span>as</span><span> </span><span>Window</span><span>;</span><span>
</span><span>if</span><span> </span><span>(</span><span>window </span><span>!=</span><span> </span><span>null</span><span>)</span><span>
</span><span>{</span><span>
</span><span>//用workingarea显示区域会出错,按照显示的Bounds来显示需要的内容。</span><span>
</span><span>//另外需要用屏幕管理软件比如displayfusion来管理各个显示器的位置。</span><span>
</span><span>//设置各个显示的坐标位置,把所有显示的高度初始都标志位0;</span><span>
window</span><span>.</span><span>Top</span><span> </span><span>=</span><span> screen</span><span>.</span><span>Bounds</span><span>.</span><span>Top</span><span>;</span><span>
window</span><span>.</span><span>Left</span><span> </span><span>=</span><span> screen</span><span>.</span><span>Bounds</span><span>.</span><span>Left</span><span>;</span><span>
window</span><span>.</span><span>Width</span><span> </span><span>=</span><span> screen</span><span>.</span><span>Bounds</span><span>.</span><span>Width</span><span>;</span><span>
window</span><span>.</span><span>Height</span><span> </span><span>=</span><span> screen</span><span>.</span><span>Bounds</span><span>.</span><span>Height</span><span>;</span><span>
</span><span>//每个窗口都需要加载window_load函数,然后再window_load函数中定义窗口的最大化,不能在显示的时候进行</span><span>
</span><span>//最大化设置,不然窗口会现实回主显示器中。</span><span>

window</span><span>.</span><span>Show</span><span>();</span><span>
</span><span>}</span>

4。显示功能的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<span>    </span><span>//获取显示器的数量</span><span>
</span><span>List</span><span>&lt;</span><span>System</span><span>.</span><span>Windows</span><span>.</span><span>Forms</span><span>.</span><span>Screen</span><span>&gt;</span><span> screens </span><span>=</span><span> </span><span>System</span><span>.</span><span>Windows</span><span>.</span><span>Forms</span><span>.</span><span>Screen</span><span>.</span><span>AllScreens</span><span>.</span><span>ToList</span><span>();</span><span>
screens</span><span>.</span><span>Sort</span><span>((</span><span>x</span><span>,</span><span> y</span><span>)</span><span> </span><span>=&gt;</span><span> x</span><span>.</span><span>Bounds</span><span>.</span><span>X</span><span>.</span><span>CompareTo</span><span>(</span><span>y</span><span>.</span><span>Bounds</span><span>.</span><span>X</span><span>));</span><span>
</span><span>//对显示器的边界坐标进行排序,0最小的为主显示器,其他的显示按照中间,左边,右边挨个显示,</span><span>
</span><span>//如果获取到显示器数量为4个,则表示4个显示器打开了。主显示器也已经打开,则程序启动后直接显示主界面以外的3个显示器</span><span>
</span><span>//用workingarea显示区域会出错,按照显示的Bounds来显示需要的内容。</span><span>
</span><span>//另外需要用屏幕管理软件比如displayfusion来管理各个显示器的位置。</span><span>
</span><span>//设置各个显示的坐标位置,把所有显示的高度初始都标志位0;</span><span>
</span><span>Window1</span><span> window1 </span><span>=</span><span> </span><span>new</span><span> </span><span>Window1</span><span>();</span><span>
</span><span>Window2</span><span> window2 </span><span>=</span><span> </span><span>new</span><span> </span><span>Window2</span><span>();</span><span>


</span><span>if</span><span> </span><span>(</span><span>screens</span><span>.</span><span>Count</span><span> </span><span>==</span><span> </span><span>4</span><span>)</span><span>
</span><span>{</span><span>
</span><span>Display</span><span>(</span><span>this</span><span>,</span><span> screens</span><span>[</span><span>1</span><span>]);</span><span>
</span><span>Display</span><span>(</span><span>window1</span><span>,</span><span> screens</span><span>[</span><span>2</span><span>]);</span><span>
</span><span>Display</span><span>(</span><span>window2</span><span>,</span><span> screens</span><span>[</span><span>3</span><span>]);</span><span>
</span><span>}</span><span>
</span><span>else</span><span>
</span><span>{</span><span>
</span><span>if</span><span> </span><span>(</span><span>screens</span><span>.</span><span>Count</span><span> </span><span>&gt;</span><span> </span><span>1</span><span>)</span><span>
</span><span>Display</span><span>(</span><span>window1</span><span>,</span><span> screens</span><span>[</span><span>1</span><span>]);</span><span>
</span><span>else</span><span>
</span><span>Display</span><span>(</span><span>window1</span><span>,</span><span> screens</span><span>[</span><span>0</span><span>]);</span><span>
</span><span>if</span><span> </span><span>(</span><span>screens</span><span>.</span><span>Count</span><span> </span><span>&gt;</span><span> </span><span>2</span><span>)</span><span>
</span><span>Display</span><span>(</span><span>window2</span><span>,</span><span> screens</span><span>[</span><span>2</span><span>]);</span><span>
</span><span>else</span><span>
</span><span>Display</span><span>(</span><span>window2</span><span>,</span><span> screens</span><span>[</span><span>0</span><span>]);</span><span>
</span><span>}</span>