本文主要采用 GlyphTypeface 类尝试获取每个字符的宽度和高度的值,尽管这个方法和最终 WPF 布局使用的文本的宽度和高度是不相同的,但是依然可以作为参考

获取系统字体文件夹的文件

系统字体文件夹放在 @"C:\Windows\Fonts" 本文不讨论用户的系统盘放在其他盘里面

使用 Directory.GetFiles 可以获取所有字体文件

   var fileList = Directory.GetFiles(@"C:\Windows\Fonts", "*.ttf");

通过 *.ttf 可以限定只获取 ttf 文件

创建 GlyphTypeface 对象

通过 Uri 传入文件路径可以创建

            foreach (var font in fileList)
{
var uri = new Uri(font);
GlyphTypeface g = new GlyphTypeface(uri);
}

获取定义的字符的宽度和高度比例

需要注意的是一个字体文件也许会包含多个不同的 FontFamily 因此 FontFamily 创建的时候还需要传入名字进去

            foreach (var font in fileList)
{
var uri = new Uri(font);
GlyphTypeface g = new GlyphTypeface(uri); var charList = g.AdvanceHeights.Keys; foreach (var fontName in g.FamilyNames.Values)
{
var fontFamily = new FontFamily(uri, fontName); var fontSize = 10; foreach (var c in charList)
{
var w = g.AdvanceWidths[c];
var h = g.AdvanceHeights[c]; }
}
}

这里拿到的 w 和 h 就是宽度和高度比例

注意,这个值和最终文本渲染字符大小没有很本质的关系

以下是我提供的一些测试的值,我隐藏了最终渲染字符的大小计算方法,此方法是团队内部 文本框3.0 计算方法,此库可以做出比 PPT 文本框差的多的效果

		size	{1.95666666666667,11.84}	System.Windows.Size
w 0.466796875 double
h 0.9443359375 double
hw 6.0511073253833052 double
wh 0.165259009009009 double

其中 hw 和 wh 的计算方法如下

var hw = size.Height / size.Width;
var wh = size.Width / size.Height;

GlyphTypeface Class (System.Windows.Media)

如果需要设置 FontWeight 等影响,可以使用先创建 Typeface 的方法,请看下面代码

var typeface = new Typeface(fontFamily, fontStyle, fontWeight, FontStretches.Normal);
typeface.TryGetGlyphTypeface(out GlyphTypeface glyph);
// 如果 TryGetGlyphTypeface 创建失败,那么就是缺少字体等,可以尝试使用微软雅黑等默认字体

上面代码获取 glyph 就可以使用和上文相同的方法获取文本字符宽度

WPF 获取本机所有字体拿到每个字符的宽度和高度的更多相关文章

  1. WPF 精修篇 获取系统颜色和字体样式

    原文:WPF 精修篇 获取系统颜色和字体样式 看效果 <Grid> <Rectangle Fill="{DynamicResource {x:Static SystemCo ...

  2. Wpf 获取指定字体和大小的字符的长宽

    Wpf 获取指定字体和大小的字符的长宽 运行环境:Win10 x64, NetFrameWork 4.8, 作者:乌龙哈里,日期:2019-05-09 参考: 章节: 比如一个 Consolas 字体 ...

  3. c#中如何获取本机MAC地址、IP地址、硬盘ID、CPU序列号等系统信息

    我们在利用C#开发桌面程序(Winform)程序的时候,经常需要获取一些跟系统相关的信息,例如用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统名称.物理内存等. 首先需要引入命名空间: us ...

  4. 【Win 10 应用开发】获取本机的IP地址

    按照老规矩,也是朋友的建议,老周今天在吹牛之前,先讲一个小故事. 有朋友问我,老周,你现在还发短信吗,你每个月用多少电话费?唉,实话说,现在真的发短信不多了,套餐送的130条短信,每月都发不了一条.至 ...

  5. 获取本机IP地址

    这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

  6. python未知网卡名情况下获取本机IP

    import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...

  7. 关于是用dotnet获取本机IP地址+计算机名的方法

    印象中在maxscript帮助文档里找到过方法,但是当时没记下来.只能通过dotnet实现了. 如果电脑有无线网卡和本地连接,可能会出现乱码,也问了写dotnet的朋友,提供了一些思路,不过最终还是使 ...

  8. C#获取本机公网IP

    /// <summary> /// 获取本机公网IP /// </summary> /// <returns></returns> public sta ...

  9. 怎样获取本机的ip地址

    首先介绍一下用到的结构体 struct hostent { const char *h_name; // official name of host char **h_aliases; // alia ...

  10. android 获取本机SMI卡号码

    //获取手机号码 TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); S ...

随机推荐

  1. 蓝牙HFP协议推荐的语音丢包补偿算法浮点实现的定点化

    最近在做蓝牙的宽带语音通话.相对于蓝牙窄带语音,主要变化是把采样率从8k变到16k,以及编解码器从CVSD变成mSBC(modified SBC,改进的SBC)等.蓝牙语音通话相关的HFP(Hand ...

  2. 容器镜像加速指南:探索 Kubernetes 缓存最佳实践

    介绍 将容器化应用程序部署到 Kubernetes 集群时,由于从 registry 中提取必要的容器镜像需要时间,因此可能会出现延迟.在应用程序需要横向扩展或处理高速实时数据的情况下,这种延迟尤其容 ...

  3. 【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程

    写在前面 在前面的<[String注解驱动开发]你真的了解@PostConstruct注解和@PreDestroy注解吗?>一文中,我们简单的介绍了@PostConstruct注解与@Pr ...

  4. 一个可以让你有更多时间摸鱼的WPF控件(一)

    前言 我们平时在开发软件的过程中,有这样一类比较常见的功能,它没什么技术含量,开发起来也没有什么成就感,但是你又不得不花大量的时间来处理它,它就是对数据的增删改查.当我们每增加一个需求就需要对应若干个 ...

  5. NET Core使用Grpc通信(一):一元

    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡.跟踪.运行状况检查和身份验证. gRPC通过使用 Protocol Buffers ...

  6. Python---flask框架实现清除cookies功能

    路由部分: 1 #用户退出清理cookie 2 @app.route('/clean_cookies',methods=['GET', 'POST']) 3 def clean_cookies(): ...

  7. #Tarjan,SPFA#洛谷 3627 [APIO2009] 抢掠计划

    题目 分析 首先重复走,钱只会计算一次,而且与路程长度无关,考虑有向图缩点,然后跑最长路,这里吧边权取反跑最短路,然后在酒吧结束也就是求\(-dis[col_x]\)的最大值,\(col_x\)也就是 ...

  8. #Tarjan#洛谷 4819 [中山市选]杀人游戏

    题目 分析 缩点后显然只考虑入度为0的点的个数, 但是问题是如果有一个入度为0的点缩点前只有1个点 且它的出边上的所有点都可以被其它入度为0的点遍历, 那么可以将其它点全部排除后剩下的这个点就是凶手, ...

  9. 如何在openGauss 2.1.0中使用Job

    如何在 openGauss 2.1.0 中使用 Job 如何在 openGauss 2.1.0 中使用 Job Job 类似 unix 中的 crontab,有定时执行的功能,可以在指定的时间点或每天 ...

  10. centos7或者centos8下安装google-chrome谷歌浏览器 亲测成功 20220302

    第一步: wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 第二步: 安装 Google ...