2012-10-08 141 views
4

爲什麼下面的代碼不會拋出異常?爲什麼新的FontFamily(「無效字體」)不會拋出異常?

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

我需要知道,如果一個特定的font(例如fontFamily,FontStyle,fontWeight設置的組合,...)在我目前的操作系統存在。我該怎麼辦?

+0

應根據http://msdn.microsoft.com/ru-ru/library/2ext31w1.aspx –

+1

@Artur Udod拋出異常:這是'System.Drawing.FontFamily',這不是一部分的WPF。 – BoltClock

+0

@BoltClock,沒有注意到wpf標籤=) –

回答

7

這是設計。程序經常要求機器上沒有的字體,特別是在遠離程序員住所的國家。字體映射器產生另一種選擇。字體替換通常很常見。如果您位於Windows計算機上,您現在正在查看Arial。但是我可以把你的世界粘貼到這篇文章中,即使Arial沒有漢字字形,你也會看到它的準確渲染。

所以,提示一號是不真正擔心可用的字體。 Windows api擁有EnumFontFamiliesEx()來枚舉可用的字體系列。但是這並沒有在WPF中暴露出來,與OpenType有一些摩擦,這是一種與Windows很不兼容的字體標準。看起來,當Adobe參與微軟所做的任何事情時都會產生另一個陰影。

關於Winforms的FontFamily類的評論有些混亂。在這種情況下,它實際上可用,它的GetFamilies()方法返回可用系列的數組。但只有TrueType,不是OpenType字體。

+0

我有這個應用程序崩潰,沒有拋出任何異常,只有當它運行在某些機器上,並且只有當我設置某種類型的字體(例如斜體尼娜)。但是當我在其他機器上運行它時,或者如果我設置了不同的字體(普通Nina),它就具有正常行爲。你怎麼能解釋這種奇怪的行爲? – Nick

0

要回答爲什麼不拋出異常的問題,根據到FontFamily Constructor on MSDN直到框架版本3.5才添加該異常。

我懷疑你的目標是3.0版或更低版本。

乾杯!

+1

這是'System.Drawing.FontFamily'。 System.Windows.Media.FontFamily的構造函數從不拋出異常,除非參數爲null。 – BoltClock

+0

不,構造函數拋出一個ArgumentNullException如果參數爲null,但在我的情況下,它不是。 – Nick

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(); 
+0

說了這些 - Hans Passant的答案可能更合適。 –

相關問題