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,关于这个问题,大家如果有实现的方法,望不吝赐教?!

欢迎大家批评指正!

转载于:https://www.cnblogs.com/my-sky/p/8944428.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值