本文主要采用 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. java基础的项目

    334,零钱通 思路: (1) 先完成显示菜单,并可以选择菜单,给出对应提示 (2) 完成零钱通明细,简单的话可以使用String拼接 (3)完成收益入账   完成功能驱动程序员增加新的变化和代码 ( ...

  2. [Java]细节与使用经验

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032072 出自[进步*于辰的博客] 纯文字阐述,内 ...

  3. Typora基础使用教程

    Typora基础使用教程(入门级) 安装和激活 安装 typora任意地方搜索下载即可 激活 百度网盘链接链接:https://pan.baidu.com/s/1WKig_3-hkDZTRjS1rgG ...

  4. 国民经济行业分类与代码(GB/T 4754-2002、GB/T 4754-2011、GB/T 4754-2017)并存入MySQL数据库【可获取下载】

    戳链接下载:https://download.csdn.net/download/weixin_45556024/34913490 或关注公众号[靠谱杨阅读人生]回复[行业]获取. 整理不易,资源fu ...

  5. 汇编语言-int指令

    int 指令 int 指令的格式为:int n,n为中断类型码,它的功能是引发终端过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下. 取中断类型码n: 标志寄存器入栈, ...

  6. #线性基,差分,线段树#洛谷 5607 [Ynoi2013] 无力回天 NOI2017

    题目 分析 考虑区间修改比较难操作,将数组差分一下,转化成两次单点修改. 这样查询前缀的异或值就是该位置的异或值,线性基可以用线段树维护, 那么取出 \((l,r]\) 所在的线性基,再将 \(a[l ...

  7. #树状数组#洛谷 4113 [HEOI2012]采花

    题目 分析 与HH的项链类似 离线处理询问,按右端点排序,维护最近的颜色和第二近的颜色,修改以第二近的颜色为准 换句话说,若最近颜色的位置为\(pos2\),第二近颜色的位置为\(pos1\) 加入一 ...

  8. OpenHarmony创新赛 | 您有一份创新激励奖待领取 请查收!

      2023开源和信息消费大赛 开放原子开源大赛OpenHarmony创新赛 (以下简称"OpenHarmony创新赛") 正如火如荼的进行当中 赛程也即将进入到提交作品的关键阶段 ...

  9. 新版本NOI Linux发布,支持VSCode,Code::Blocks开发C++!!!,内附下载地址。

    注意VSCODE 虽然有C艹插件,但是在第一次编译的时候必须要有网络,否则用不了 我推荐还是用CODE::BLOCKS 作者10月8日补充 有些省份已经开始强制在NOIP的比赛里使用NOI Linux ...

  10. 深度剖析 Spring 框架在 Java 应用开发中的优势与应用

    Spring 是用于企业 Java 应用程序开发的最流行的应用程序开发框架.全球数百万开发人员使用 Spring Framework 创建高性能.易于测试和可重用的代码.Spring Framewor ...