WPF 对应不同DPI时窗口位置调整

        最近在做一个项目,需要窗口依附于令一个元素,显示在他的上面,或者是下面。我这里又不能用popup,只能用窗口了, 所以呢,在100%DPI的时候,我的窗口显示都没有问题,但是当把DPI调成125%或者更高的时候,问题就来了。

高DPI下,发现我的窗口不见了。有的时候会出来,但是移动它依附的元素的时候,窗口又不知所踪了。

        这个开始就是知道是DPI的原因,但是在网上搜了很多相关内容,都只是说如何获取电脑的DPI,没有说明如何应用获取到的DPI。

经过我多次尝试,修改DPI后,并不是所有的尺寸相关的东西都要针对DPI做相应的处理。

关于DPI的介绍,下面这位大神介绍的比较清晰了已经:

 https://www.cnblogs.com/xiaokang088/archive/2011/03/02/1969237.html

        我这里要解释的其实是电脑里面设置的DPI,其实是改变了原来每个点的大小,也就是如果DPI调到125%,那么每个点的大小是原来的1.25倍,这样每英寸下的点数其实是减少了的,是原来的96/125个,但是WPF窗口不会减少点数来显示,所以DPI增大后,WPF窗口其实是变大的,这个微软给我们做了处理,不用我们来做额外的工作。

       同理如果我们手动将窗口固定到了某个位置,在高DPI下,这个位置(x,y)距离窗口左上角的距离是被放大的,即原来的400,在125%下是500,所以,如果我们还想让窗口显示在我们想要的位置,这时就要对(x, y)做不同于窗口放大的反应了,也就是说高DPI时,我们的窗口放大了,这时我们反而要将(x, y)变小,也就是减少窗口距离屏幕左上角的像素数,变成(x/1.25,  y/1.25),这样才能保证窗口的位置在屏幕上是不变的,只是改变了窗口的大小。

        以下是获取系统DPI的方法:

Graphics g = Graphics.FromHwnd(IntPtr.Zero); g.DpiX  和 g.DpiY   就是系统的DPI。

 

获取DPI的方法,还有很多种,大家都可以在网上找到。

关于这个其实我还有个疑问,就是我改变DPI后,我的WPF程序不能实时获取到最新的DPI,必须要重新启动系统,才能获取到正确的DPI,关于这个问题,大家如果有实现的方法,望不吝赐教😄!

欢迎大家批评指正!

posted @ 2018-04-25 14:19  my-sky  阅读(697)  评论(0编辑  收藏  举报