1. 程式人生 > >關於WPF字體的小問題

關於WPF字體的小問題

是什麽 ado cnblogs 安裝 use 函數 down led com

獲取系統字體

??在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字體的小問題