关于WPF字体的小问题

Posted erdao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于WPF字体的小问题相关的知识,希望对你有一定的参考价值。

获取系统字体

??在WPF中获取系统字体最常规的方法是:

var systemFamilies = Fonts.SystemFontFamilies;

然而在有些情况下,此方法并不能完全获取到所有字体,比如:该字体未签名、该字体为用户自定义的字体,未按照规范添加所有字体信息。这个时候可以使用WinForm的方法:

InstalledFontCollection installedFontCollection = new InstalledFontCollection();

fontFamilies = installedFontCollection.Families;

第二种方法走的是GDI+的API,直接获取底层字体,而第一种方法做了较多关于字体类型和信息的判断,猜测是在这些判断中丢失了部分字体。

初始化一个未安装的字体会怎样?

??我们习惯用这样的方式使用字体:

var fontfamily = new FontFamily("xxx0");

如果xxx0字体并未在程序运行的系统上安装呢?

WPF考虑到了这种情况,所以可以在FontFamily的构造函数中传入多个字体,系统会从前往后自动匹配:

var fontfamily = new FontFamily("xxx0,xxx1");

系统优先匹配xxx0,如果xxx0未安装则使用xxx1字体。如果xxx1也未安装呢?

比如,随便输入一个字符串作为FontFamily的构造函数参数得到的字体会是什么呢?

技术分享图片

这个Arail从哪里来的?

MSDN告诉我们,这种情况会读取"C:\Windows\Fonts\GlobalUserInterface.CompositeFont"文件中配置的字体,然而在多个系统上验证发现,压根儿无法找到该文件,也无法添加该文件到Fonts目录下,那Arail从哪里来呢?

带着疑问翻开源码?在FontFamily的源码中找到这么一段代码:

internal static readonly CanonicalFontFamilyReference NullFontFamilyCanonicalName = CanonicalFontFamilyReference.Create(null, "#ARIAL");

也就是说微软定义了一个默认的字体来处理字体找不到的情况,而并非走的GlobalUserinterface.CompositeFont那一套。

date: 2017-11-20 20:14:48

以上是关于关于WPF字体的小问题的主要内容,如果未能解决你的问题,请参考以下文章

关于WPF中menu的问题

文本渲染仍然模糊:WPF 应用程序的最佳字体?

dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退...

WPF字体缩放

在WPF(core版本)中引用外部字体不可用问题说明

wpf中如何使用代码设置属性Foreground,或者说设置控件字体颜色。