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

13

我不希望我的WPF GUI随着Windows字体大小选项(DPI)的改变而缩放。这不仅仅是在UserControl上指定固定字体大小的问题,因为缩放会影响UserControl中的图像和边框。是否有一种属性可以设置UserControl以关闭缩放?如果没有,我该如何做到这一点?


4
分辨率独立性是 WPF 的核心思想之一。关闭它并不是一个好主意,特别是如果它只会影响到 UI 的一部分。在各种计算机上实际使用的 DPI 范围将会增加,具有巨大像素密度的显示器已经在路上了。 - Matěj Zábský
2
一般来说,我同意你的观点。但在这种情况下,我确实需要关闭缩放,因为此UserControl托管在一个现有的Windows Forms应用程序中,该应用程序没有实现缩放。结果是,我有一些具有大字体的应用程序部分和一些具有固定字体的应用程序部分。目前不可行支持Windows字体设置在其余的Windows Forms应用程序中。 - Sylvain
1
我猜那是有道理的,那就+1吧。 - Matěj Zábský
我有完全相同的问题。混合应用程序是一个问题,特别是在平板电脑下。 - John Fairbanks
3个回答

12
你可以根据当前的 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比例因子的代码来源于这篇博客文章

2

Windows包括一个兼容性助手,用于处理在高dpi设置下失败的有缺陷应用程序:

确保关闭(或关闭)"使用Windows XP样式DPI缩放":

enter image description here

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

Windows将欺骗您的应用程序,告诉它它是96dpi,然后图形卡会为您缩放整个窗口。

所有内容都会稍微模糊,通常很难使用,但在您修复有缺陷的WinForm控件之前,它足以正常工作。

注意: dpiAware清单条目允许您的应用程序告诉Windows它想要退出dpi缩放。只有经过高dpi测试的应用程序才会添加此项。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接