4

为什么下面的代码没有抛出异常?

FontFamily font = new FontFamily("bla bla bla");

我需要知道font我当前的操作系统中是否存在特定的(作为 FontFamily、FontStyle、FontWeight 的组合...)。我该怎么办?

4

4 回答 4

7

这是设计使然。程序经常要求机器上不存在的字体,尤其是在远离程序员住所的国家。字体映射器产生一个替代方案。字体替换通常非常普遍。如果您在 Windows 机器上,您现在正在查看 Arial。但是我可以将你好世界粘贴到这篇文章中,你会看到它准确呈现,即使 Arial 没有汉字字形。

所以第一个提示是不要真正担心可用的字体。Windows api 有 EnumFontFamiliesEx() 来枚举可用的字体系列。但这并没有在 WPF 中公开,那里与 OpenType 存在一些摩擦,这是一种与 Windows 集成得相当差的字体标准。当 Adob​​e 参与微软所做的任何事情时,似乎又是一个阴影。

关于 Winforms 的 FontFamily 类的评论有些混乱。在这种情况下实际上是可用的,它的 GetFamilies() 方法返回一个可用系列的数组。但只有 TrueType,而不是 OpenType 字体。

于 2012-10-08T21:37:37.107 回答
0

你可以使用类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

于 2012-10-08T20:40:46.683 回答
0

您可以使用 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();
于 2012-10-08T21:41:21.690 回答
0

为了回答为什么它不抛出异常的问题,根据MSDN 上的 FontFamily Constructor,直到框架版本 3.5 才添加异常。

我怀疑您的目标是 3.0 或更低版本。

干杯!

于 2012-10-08T20:51:11.877 回答