在.NET Framework 4.6.2中,FormattedText()已过时,我该如何解决?

21
当我尝试使用 .NET Framework 4.6.2 构建 WPF 项目时,我遇到了一个错误,因为 FormattedText() 方法已经被废弃了,如下所示:[Obsolete("Use the PixelsPerDip override", false)] public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground); 新的重载方法是:public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, double pixelsPerDip); 问题:如何确定 pixelsPerDip 的值?
问题:如果对于我的项目来说 pixelsPerDip 没有用处,我该如何使用旧构造函数而不包含 pixelsPerDip?
2个回答

30
你需要计算你的显示器DPI,请参阅:如何在WPF中获取DPI? 此外,.Net 4.6.2带来了处理DPI感知的新API,因此上述方法可能已过时(例如VisualTreeHelper.GetDpi())。请参见这里。以下是一些示例代码和用户指南:https://github.com/Microsoft/WPF-Samples/tree/master/PerMonitorDPI 我认为添加此参数是为了使您的程序能够在具有不同DPI的监视器之间拖动并正确缩放。
从FormattedText声明中:pixelsPerDip:
像素每个独立像素密度值,相当于比例因子。例如,如果屏幕的DPI为120(或1.25,因为120/96 = 1.25),那么每个独立像素密度将绘制1.25个像素。 DIP是由WPF使用的测量单位,以独立于设备分辨率和DPI。
如果你只有一个显示器,因此不需要任何DPI更改事件处理,请在Window的OnLoaded()事件中(或在你的构造函数中)使用以下内容作为示例:
var pixelsPerDip =  VisualTreeHelper.GetDpi(this).PixelsPerDip;

谢谢Leguanjoe,但是我的项目无法切换显示器,所以你知道我能设置默认值吗?(例如“-1”)或者有其他方法可以在不获取DPI的情况下使用这个构造函数,提前感谢你。 - D.Andy
如果您不想使用VisualTreeHelper方法,我会选择“1.0”,这样函数将期望一个具有96 DPI的监视器。即使您只使用一个屏幕,我也不确定这个值是否起作用。我尝试了“5”,但仍然没有看到FormattedText大小的变化。 - Leguanjoe
所以我浏览了开发者指南,将PixelsPerDip设置为任何值的原因可能是以下之一: - Leguanjoe
WPF应用程序默认具有系统DPI感知功能,并需要通过app.manifest文件声明自己是Per Monitor DPI感知的。 - Leguanjoe
所以,如果你的应用程序没有声明为Per Monitor DPI aware(在你的情况下是正确的),pixelsPerDip参数就不会起作用。 - Leguanjoe
显示剩余2条评论

4
被接受的答案并没有错,但是需要阅读相当多的文字,最后你仍然没有一个直接的解决方案,可以快速输入并解决问题。警告是在说这个特定的FormattedText()重载已经被弃用了,但是还有另一个你应该使用的存在。所以,一般来说,你只需要用这个替换:new FormattedText( ... ); 用这个:new FormattedText( ..., 1.0 );

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