如何防止WPF使用Windows字体大小选项进行缩放?

时间:2011-05-02 12:25:19

标签: wpf highdpi

我不希望我的WPF GUI与Windows字体大小选项(DPI)一起扩展。这不仅仅是在UserControl上指定固定字体大小的问题,因为缩放会影响UserControl中的图像和边框。我可以在UserControl上设置一个属性来关闭scalling吗?如果没有,我该怎么做?

3 个答案:

答案 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缩放”:

enter image description here

并确保您的应用程序在其程序集清单中没有“dpiAware”条目。

Windows将骗你的应用程序,告诉它它是96dpi,然后显卡将为你扩展整个窗口。

一切都会有点模糊,并且通常使用起来很不愉快,但它会很好地运行,直到你可以修复有缺陷的WinForm控件。

  

注意: dpiAware清单条目可让您的应用告诉Windows它希望选择退出 dpi-scaling。应用程序仅在高dpi测试时才添加此项目。

答案 2 :(得分:1)

除了DpiDecorator之外,您还需要修复项目的字体大小。例如,在Windows XP中,如果您的设置设置为“大字体”,则“菜单项”字体大小设置为14,并且还使用DPI设置放大,因此,如果您不修复MenuItem字体大小或任何其他UI项字体,您将获得此项类型的Window的默认值。还要记住,用户可以手动更改其他项目的字体大小/字体...