關於WPF字體的小問題
阿新 • • 發佈:2018-02-06
是什麽 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字體的小問題