我不希望我的WPF GUI随着Windows字体大小选项(DPI)的改变而缩放。这不仅仅是在UserControl上指定固定字体大小的问题,因为缩放会影响UserControl中的图像和边框。是否有一种属性可以设置UserControl以关闭缩放?如果没有,我该如何做到这一点?
我不希望我的WPF GUI随着Windows字体大小选项(DPI)的改变而缩放。这不仅仅是在UserControl上指定固定字体大小的问题,因为缩放会影响UserControl中的图像和边框。是否有一种属性可以设置UserControl以关闭缩放?如果没有,我该如何做到这一点?
public class DpiDecorator : Decorator {
public DpiDecorator() {
this.Loaded += (s, e) => {
Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;
ScaleTransform dpiTransform = new ScaleTransform(1 / m.M11, 1 / m.M22);
if (dpiTransform.CanFreeze)
dpiTransform.Freeze();
this.LayoutTransform = dpiTransform;
};
}
}
你可以将这个逻辑移到你的UserControl中。Windows包括一个兼容性助手,用于处理在高dpi设置下失败的有缺陷应用程序:
确保关闭(或关闭)"使用Windows XP样式DPI缩放":
并确保您的应用程序在其程序集清单中没有"dpiAware
"条目。
Windows将欺骗您的应用程序,告诉它它是96dpi,然后图形卡会为您缩放整个窗口。
所有内容都会稍微模糊,通常很难使用,但在您修复有缺陷的WinForm控件之前,它足以正常工作。
注意:
dpiAware
清单条目允许您的应用程序告诉Windows它想要退出dpi缩放。只有经过高dpi测试的应用程序才会添加此项。
除了DpiDecorator之外,您还需要修复项目的字体大小。例如,在Windows XP中,如果您的设置为大号字体,则菜单项字体大小设置为14,并且也使用DPI设置进行缩放,因此如果您不修复MenuItem字体大小或任何其他UI项目字体,则会获得窗口默认值。还要记住,用户可以手动更改其他项目的字体大小/字体...