为什么下面的代码没有抛出异常?
FontFamily font = new FontFamily("bla bla bla");
我需要知道font
我当前的操作系统中是否存在特定的(作为 FontFamily、FontStyle、FontWeight 的组合...)。我该怎么办?
为什么下面的代码没有抛出异常?
FontFamily font = new FontFamily("bla bla bla");
我需要知道font
我当前的操作系统中是否存在特定的(作为 FontFamily、FontStyle、FontWeight 的组合...)。我该怎么办?
这是设计使然。程序经常要求机器上不存在的字体,尤其是在远离程序员住所的国家。字体映射器产生一个替代方案。字体替换通常非常普遍。如果您在 Windows 机器上,您现在正在查看 Arial。但是我可以将你好世界粘贴到这篇文章中,你会看到它准确呈现,即使 Arial 没有汉字字形。
所以第一个提示是不要真正担心可用的字体。Windows api 有 EnumFontFamiliesEx() 来枚举可用的字体系列。但这并没有在 WPF 中公开,那里与 OpenType 存在一些摩擦,这是一种与 Windows 集成得相当差的字体标准。当 Adobe 参与微软所做的任何事情时,似乎又是一个阴影。
关于 Winforms 的 FontFamily 类的评论有些混乱。在这种情况下实际上是可用的,它的 GetFamilies() 方法返回一个可用系列的数组。但只有 TrueType,而不是 OpenType 字体。
你可以使用类System.Drawing.Text.InstalledFontCollection
http://msdn.microsoft.com/en-us/library/system.drawing.text.installedfontcollection.aspx
WPF 有一个特定于框架的方法Fonts.SystemFontFamilies
http://msdn.microsoft.com/en-us/library/system.windows.media.fonts.systemfontfamilies.aspx
您可以使用 Fonts.SystemFontFamilies 集合浏览系统上可用的字体 - 使用一些 Linq 来匹配您需要的任何条件;
// true
bool exists = (from f in Fonts.SystemFontFamilies where f.Source.Equals("Arial") select f).Any();
// false
exists = (from f in Fonts.SystemFontFamilies where f.Source.Equals("blahblah") select f).Any();