所提供的解决方案适用于.Net Framework 4.5,但是,随着Windows 10 DPI缩放和Framework 4.6.x添加对它的不同程度的支持,现在标记了用于测量文本的构造函数[Obsolete],以及该方法上的所有构造函数不包含pixelsPerDip参数。

不幸的是,它涉及的更多,但是新的缩放功能将导致更高的准确性。

每浸像素

根据MSDN,这表示:

每个密度独立像素的像素值,它等于比例因子。例如,如果屏幕的DPI是120(或1.25,因为120/96 = 1.25),则每个密度独立像素绘制1.25个像素。DIP是WPF用来独立于设备分辨率和DPI的度量单位。

这是我根据Microsoft / WPF-Samples GitHub存储库中具有DPI缩放感知的指导对所选答案的实现。

从Windows 10 Anniversary开始,还需要一些其他配置来完全支持DPI缩放(在代码下方),我无法使用它,但是如果没有它,它就只能在配置了缩放(并遵守缩放更改)的单个监视器上工作。上述回购中的Word文档就是该信息的来源,因为一旦添加这些值,我的应用程序将无法启动。 来自同一存储库的此示例代码也可以用作参考。

public partial class MainWindow : Window

{

private DpiScale m_dpiInfo;

private readonly object m_sync = new object();

public MainWindow()

{

InitializeComponent();

Loaded += OnLoaded;

}

private Size MeasureString(string candidate)

{

DpiInfo dpiInfo;

lock (m_dpiInfo)

dpiInfo = m_dpiInfo;

if (dpiInfo == null)

throw new InvalidOperationException("Window must be loaded before calling MeasureString");

var formattedText = new FormattedText(candidate, CultureInfo.CurrentUICulture,

FlowDirection.LeftToRight,

new Typeface(this.textBlock.FontFamily,

this.textBlock.FontStyle,

this.textBlock.FontWeight,

this.textBlock.FontStretch),

this.textBlock.FontSize,

Brushes.Black,

dpiInfo.PixelsPerDip);

return new Size(formattedText.Width, formattedText.Height);

}

// ... The Rest of Your Class ...

/*

* Event Handlers to get initial DPI information and to set new DPI information

* when the window moves to a new display or DPI settings get changed

*/

private void OnLoaded(object sender, RoutedEventArgs e)

{

lock (m_sync)

m_dpiInfo = VisualTreeHelper.GetDpi(this);

}

protected override void OnDpiChanged(DpiScale oldDpiScaleInfo, DpiScale newDpiScaleInfo)

{

lock (m_sync)

m_dpiInfo = newDpiScaleInfo;

// Probably also a good place to re-draw things that need to scale

}

}

其他需求

根据Microsoft / WPF-Samples上的文档,您需要在应用程序清单中添加一些设置,以涵盖Windows 10 Anniversary在多显示器配置中每个显示器具有不同DPI设置的能力。可以合理地猜想,如果没有这些设置,则当窗口从一个显示切换到另一个具有不同设置的显示时,可能不会引发OnDpiChanged事件,这将使您的测量继续依赖先前的DpiScale。我正在编写的应用程序是我一个人使用的,并且我没有那种设置,因此我没有什么可以测试的,而且当我按照指南进行操作时,由于出现清单错误,最终我的应用程序无法启动错误,所以我放弃了,但是最好仔细检查一下并调整您的应用清单以使其包含以下内容:

true

PerMonitor

根据文档:

[这两个]标签的组合具有以下效果:1)每个显示器的Windows NT 10周年更新2)系统

wpf 字符串 指定大小_如何计算WPF TextBlock的已知字体大小和字符宽度?相关推荐

  1. python怎么改变字体大小_如何在matplotlib图上更改字体大小

    如果你像我这样的控制狂,你可能想要明确设置你所有的字体大小: import matplotlib.pyplot as plt SMALL_SIZE = 8 MEDIUM_SIZE = 10 BIGGE ...

  2. linux终端字体大小6,[adminitrative][archlinux][setfont] 设置console的字体大小

    电脑的分辨率高了之后,用命令行进入的时候,完全看不清楚,是否容易导致眼瞎. 第一步便把字体调大就成了很必要的操作. 使用一个命令能马上生效: setfont 使用配置文件 /etc/vconsole. ...

  3. android 字体大小属于什么类型,聊聊 Android 中的字体大小适配

    本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布 前言 虽然去年写的一篇文章[一种非常好用的Android屏幕适配]就包含字体大小适配,但那篇文章讲的是根据不同屏幕尺寸来适配字体大小的 ...

  4. java jlabel 字体大小_java – 如何更改所有私有JLabel的字体大小

    我见过类似的问题,例如this,但在我的情况下,我有25个私有JLabel,我在声明时给出了一个值.我在构造函数中使用GridBagLayout将这些JLabel添加到JPanel.如果我按照链接中给 ...

  5. css 所有字体大小,前端Web开发人员的CSS相对字体大小

    在本文中,我们将看几种不同的方式,前端Web开发人员可以使用CSS操作其网页的字体. 网页设计中最大的混乱之一是由font-size属性造成的. 在CSS中,可以使用多个单元,这只会导致设计人员额外头 ...

  6. 字体大小的设置_老年人用智能手机,怎样更改字体大小?3种方法,手把手教您学会...

    分享生活小妙招,共享科技新生活!大家好,欢迎来到今天的知识分享!我是你们的好朋友小俊! 我们的老年朋友在使用手机时候都会觉得字体太小,导致使用起来非常不方便,那么今天我就教大家三种方法来设置字体大小, ...

  7. java object大小_在Java中,确定对象object大小的最佳方法是什么? - Break易站

    例如,假设我有一个应用程序,它可以读取包含一堆数据行的CSV文件.我根据数据类型向用户提供行数摘要,但是我想确保不读取太多数据行并导致OutOfMemoryErrors.每一行都会翻译成一个对象.有没 ...

  8. cad填充密度怎么调整_在CAD中一种查看字体大小、填充密度是否合适的方法

    在CAD中一种查看字体大小.填充密度是否合适的方法对于CAD的新手来说字体大小和填充密度是比较不容易控制的,看到打印出来的图中的字体不是太大了就是太小了,填充的密度不是太密了就是太稀了,起不到应有的效 ...

  9. python colorbar长度_如何改变matplotlib色标colorbar的字体大小?

    所以我们只能通过读源代码colorbar.py来寻找方法. 上图是colorbar.py文件的说明文档,从文档中我们可以看出,Figure.colorbar方法的实现依靠于make_axes函数和Co ...

最新文章

  1. Github配置(git+vscode+python+jupyter)
  2. 论流量平台(交易内容)生死劫——币看流量生意正在进入正循环
  3. python进程和线程_Python进程与线程知识
  4. IDEA中MAVEN项目打JAR包的简单方法
  5. boost::container实现扩展bwd测试分配器程序
  6. 什么都不说,来4波js
  7. 如何在React JS组件和React JS App中添加CSS样式?
  8. 关于如何在项目接口保证幂等性的一点思考
  9. java经典英文面试题,Java-英文面试题-经典
  10. Android Socket编程【转】http://duguyidao.iteye.com/blog/1069736
  11. Linux 中断总结
  12. 革命性新特性 | 单一应用跨多Kubernetes集群的部署与管理 1
  13. 系统目录 linux命令,Linux系统目录和命令介绍
  14. uniapp本地开发小程序代码超过2M,不能预览和真机调试解决办法
  15. Android 系统签名(.pk8、.pem) 制作成 storeFile
  16. 利用Echarts+阿里云地图选择器绘制可交互的行政区划地图
  17. 分享一款代码生成工具,可自定义模板生成不同的代码
  18. html5的header元素作用,html5header标签怎么用?html5header标签的作用介绍-
  19. Jenkins教程(2)插件源与常用插件
  20. 腾讯广告 广点通 数据上报 上传用户行为数据

热门文章

  1. Exchange安装与配置
  2. 彻底删除服务RabbitMQ
  3. 苹果公司注册成立 | 历史上的今天
  4. android piechart饼图内容,MPAndroidChart PieChart为什么只有在点击了饼图之后才会显示颜色?...
  5. DM8168芯片级资源(一)
  6. KOOM原理分析之一些基础知识
  7. Revit二次开发-【NO.03】外部命令(IExternalCommand)
  8. 什么是sessionFactory
  9. Android拦截短信的实现,英雄联盟手游新消息,安卓率先测试,ROG游戏手机5将提前上手?...
  10. android - 图片压缩,防止崩溃OOM