我不希望我的WPF GUI与Windows字体大小选项(DPI)一起扩展。这不仅仅是在UserControl上指定固定字体大小的问题,因为缩放会影响UserControl中的图像和边框。我可以在UserControl上设置一个属性来关闭scalling吗?如果没有,我该怎么做?
答案 0 :(得分:10)
您可以根据当前的DPI设置缩小UserControl。例如,如果您使用以下DpiDecorator包装UserControl,则无论DPI设置如何,它都应该看起来相同:
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。
获取DPI比例因子的代码来自此blog post。
答案 1 :(得分:2)
Windows包含适用于在高dpi设置下失败的错误应用程序的兼容性帮助程序:
请务必关闭(或关闭)“使用Windows XP风格的DPI缩放”:
并确保您的应用程序在其程序集清单中没有“dpiAware
”条目。
Windows将骗你的应用程序,告诉它它是96dpi,然后显卡将为你扩展整个窗口。
一切都会有点模糊,并且通常使用起来很不愉快,但它会很好地运行,直到你可以修复有缺陷的WinForm控件。
注意:
dpiAware
清单条目可让您的应用告诉Windows它希望选择退出 dpi-scaling。应用程序仅在高dpi测试时才添加此项目。
答案 2 :(得分:1)
除了DpiDecorator之外,您还需要修复项目的字体大小。例如,在Windows XP中,如果您的设置设置为“大字体”,则“菜单项”字体大小设置为14,并且还使用DPI设置放大,因此,如果您不修复MenuItem字体大小或任何其他UI项字体,您将获得此项类型的Window的默认值。还要记住,用户可以手动更改其他项目的字体大小/字体...