【问题标题】:In .NET Framework 4.6.2 the FormattedText() is Obsoleted, how can I fix it在 .NET Framework 4.6.2 中,FormattedText() 已过时,我该如何修复它
【发布时间】:2017-03-09 17:04:47
【问题描述】:

当我尝试使用 .net framework 4.6.2 构建 WPF 项目时,出现错误,因为 FormattedText() 已过时,如下所示: [过时("使用 PixelsPerDip 覆盖", false)] public FormattedText(string textToFormat, CultureInfoculture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground);

新的覆盖方法是 public FormattedText(string textToFormat, CultureInfoculture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, double pixelPerDip);

问:如何确定像素点数?

问:我如何使用没有pixelPerDip 的旧构造函数?因为pixelPerDip 对我的项目没有用。

【问题讨论】:

    标签: c# wpf-controls .net-4.6.2


    【解决方案1】:

    您需要计算显示器的 DPI,请参阅: How can I get the DPI in WPF?

    此外,.Net 4.6.2 提供了新的 API 来处理 DPI 感知,因此上述方法可能已被弃用(例如 VisualTreeHelper.GetDpi())。 见https://blogs.msdn.microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/ 这是一些示例代码和用户指南: https://github.com/Microsoft/WPF-Samples/tree/master/PerMonitorDPI

    恕我直言,已添加此参数,以便您的程序可以在具有不同 DPI 的监视器之间拖动,并且仍然可以正确缩放。

    来自 FromattedText 声明:pixelPerDip:

    Pixels Per Density Independent Pixel 值,即 相当于比例因子。例如,如果屏幕的 DPI 为 120(或 1.25,因为 120/96 = 1.25),每密度 1.25 像素 绘制独立像素。 DIP 是 WPF 使用的度量单位 独立于设备分辨率和 DPI。

    如果您只有 1 个监视器,因此不需要任何 DPI 更改事件处理,请在 Window(或构造函数)的 OnLoaded() 事件中使用以下示例:

    var pixelsPerDip =  VisualTreeHelper.GetDpi(this).PixelsPerDip;
    

    【讨论】:

    • 感谢 Leguanjoe,但是我的项目无法切换显示器,那么您知道我可以设置默认值吗? (例如“-1”)或其他我可以使用此构造函数而无需获取 DPI 的东西,提前谢谢
    • 我会使用 VisualTreeHelper 方法,如果您不想这样做,我会使用“1.0”,以便该函数需要一个具有 96 DPI 的监视器。当您仅使用 1 个屏幕时,我什至不确定此值是否起作用。我尝试了“5”,但 FormattedText 的大小仍然没有变化。
    • 所以我浏览了开发者指南,将 PixelsPerDip 设置为任意值的原因可能如下:
    • WPF 应用默认支持 System DPI,需要通过 app.manifest 文件声明自己支持 Per Monitor DPI。
    • 因此,如果您的应用未声明 Per Monitor DPI 感知(在您的情况下为真),则 pixelPerDip 参数不起作用。
    【解决方案2】:

    接受的答案没有错,但它是相当多的文本要阅读,最后你仍然没有直接的解决方案,你可以快速输入并解决问题。

    警告是说 FormattedText() 的特定重载已过时,但存在另一个您应该使用的重载。

    所以,一般来说,您需要做的就是替换这个:

    new FormattedText( ... );

    用这个:

    new FormattedText( ..., 1.0 );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2017-11-13
      • 2017-01-07
      • 2019-11-24
      相关资源
      最近更新 更多