背景:网页端调起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,服务器的编译环境和本地的应该是一致的,按照解决方案的代码就都正常了。没想通啊没想通。