2014-07-15 18 views
1

爲什麼爲什麼System.Drawing.Fontconverter.ConvertFromInvariantString(「NOTAFONT」)返回SansSerif?

var fontConverter = new FontConverter();    
var retFont = fontConverter.ConvertFromInvariantString("NOTAFONT"); 

return {Name = "Microsoft Sans Serif" Size=8.25} 

,不拋出異常?

使用此代碼我打算測試一個字符串,如果它包含有效的字體序列化。有其他方法可以檢查嗎?

我查了FontConverter類的代碼,它創造這樣的returnfont:

var retFont = new Font("notafont", 1.2f, FontStyle.Bold); 

返回的字體是{名稱=「Microsoft無襯線」大小= 1.2}

+0

修飾你怎麼測試,你可以得到安裝的字體的枚舉,並檢查您的字符串的可用字體相匹配。 –

+0

@Mark:看到我的更新(IsFontStringValid) – schoetbi

+0

請不要複製問題的接受答案。這樣做沒有意義,它可能會混淆選民。 –

回答

3

MSDN Documentation on the Font Class備註部分有一個有趣的聲明。

即:

有關如何構建字體,請參閱如何瞭解更多信息:構建字體家族和字體。 Windows窗體應用程序支持TrueType字體,並且對OpenType字體的支持有限。 如果您嘗試使用不支持的字體,或者該字體未安裝在運行該應用程序的機器上,Microsoft Sans Serif字體將被替換爲

我想你會看到這種行爲。

不知道這是否會滿足您的需求,但在這種情況下,我使用InstalledFontCollection來驗證字體是否可用。

bool CheckFontAvailability(string value) 
{ 
    FontCollection fc = new InstalledFontCollection(); 
    return fc.Families.Any(ff => ff.Name.Contains(value)); 
} 

或schoetbi

bool CheckFontAvailability(string fontAsString) 
{ 
    FontCollection fc = new InstalledFontCollection(); 
    return fc.Families.Any(ff => fontAsString.StartsWith(ff.Name)); 
} 
+1

謝謝你,你發現它。它沒有提到FontConverter類。 – Oliver

+1

非常好:我只是修改了你的解決方案,以匹配完整的fontString風格見我的更新。 – schoetbi

1

看來,如果您的給定字體無法找到並且不可用,您總會得到「Microsoft Sans Serif」字體。我嘗試了FontConverter班和Font班。

var font = new Font("Arial", 12, FontStyle.Bold); 

嘗試過了,作爲指定了Arial字體。

我無法在MSDN上找到關於此主題的任何評論,即如果找不到給定字體,則總是返回「Microsoft Sans Serif」。

+0

你是對的。我目前的實現是將字體轉換回字符串,並檢查該字符串的字體系列是否以與我原始輸入字符串相同的值開始。不是一個美麗的解 – schoetbi