WPF程序处理DPI问题

文章描述了一种在网页端调用WPF程序时遇到的DPI缩放问题,当桌面缩放比例为125%时,界面显示异常。作者尝试通过Graphics对象获取DPI倍率但得到的结果始终为1,而本地编译和服务器编译的结果不一致。通过反射获取SystemParameters的DpiX和DpiY属性解决了问题,现在程序可以在缩放情况下正常运行。此外,将解决方案放入SizeChange事件中确保了动态调整的适应性。
摘要由CSDN通过智能技术生成

背景:网页端调起wpf程序(.net4.5版本),界面包括一个winformHost控件包裹另外一个wpf应用程序,当调整桌面缩放比例时  放大为125%,界面显示异常,显示效果如下:

 外层wpf的winformHost控件的构造函数已经通过Graphics进行DPI处理,代码如下:

 using (Graphics g=Graphics.FromHwnd(IntPtr.Zero))
{
     _xRatio = g.DpiX/96;
     _yRatio = g.DpiY/96;
}

但是由现象可知,这个效果就是没有进行相应的缩放处理,于是增加日志,服务器编译后查看,_xRatio和_yRatio均是1;(奇怪的一点是 本地编译后替换到程序路径下。是正常的1.25,但是通过服务器编译后,日志打印的始终是1,到现在也没想通)

参考C#工作总结(五):Winform与WPF程序处理DPI问题_Jeffrey_Chou的博客-CSDN博客

将构造函数的代码调整为通过这种反射方式获取

var dpiXProperty = typeof(SystemParameters).GetProperty("DpiX", BindingFlags.NonPublic | BindingFlags.Static);
var dpiYProperty = typeof(SystemParameters).GetProperty("Dpi", BindingFlags.NonPublic | BindingFlags.Static);
var dpiX = (int)dpiXProperty.GetValue(null, null);
var dpiY = (int)dpiYProperty.GetValue(null, null);
var dpixRatio = dpiX/96;
var dpiyRatio = dpiY/96;

问题得以解决,在缩放情况下可以正常使用。

把该方法放到sizechange事件中,在程序运行过程中也可以跟随调整。

为什么通过Graphics获取到的缩放倍率始终为1目前也没想明白。

Winforms: 为什么Graphics.DpiX/DpiY总是返回96_cadcisdhht的博客-CSDN博客

这个原因分析也没太看懂,因为我这里发现的是本地编译好替换程序中的dll后,打印出来的缩放倍率正常,相同的代码服务器编译后,却始终为1,服务器的编译环境和本地的应该是一致的,按照解决方案的代码就都正常了。没想通啊没想通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值