2014-11-24 19 views
0

我想開發一個應用程序的字體。在ListView中,我列出了所有已安裝的字體。現在我想顯示用該字體編寫的字體名稱。設置每個ListViewEntry使用不同的字體

InstalledFontCollection installedFontCollection = new InstalledFontCollection(); 

fontFamilies = installedFontCollection.Families; 

int fontCount = fontFamilies.Length; 
familyList = new ListViewItem[fontCount]; 

for (int i = 0; i < fontCount; i++) 
{ 
    familyList[i] = new ListViewItem(fontFamilies[i].Name); 
} 

listView1.Items.AddRange(familyList); 

在for循環中,我嘗試用

familyList[i].Font = new Font(fontFamilies[i], 12); 

設置字體然而,所有的文字變成空白。

如果我硬編碼值,它工作正常。甚至當我硬編碼基於隨機條件不同的字體,說

if (i % 2 == 0) 
    familyList[i].Font = new Font(fontFamilies[53], 12); 
else 
    familyList[i].Font = new Font(fontFamilies[12], 12); 

列表交替的字體如預期。

這裏有什麼問題?某些字體可能未定義或無法使用,導致整個列表失敗?沒有錯誤被拋出。

謝謝。

+0

你用什麼? WinForms,WPF?我想呢,WinForms, – 2014-11-24 10:36:21

+0

?這是Visual Studio 2013中的WindowsFormsApplications。 – 2014-11-24 11:02:12

回答

0

的構造

new Font(FontFamily fontFamily, Float fontSize); 

自動設置字體樣式爲 「普通」。但是,並非所有的字體實際上都支持的Regular Style()。

更好的結果可以通過檢查使用fontstyle-枚舉來實現:

if (fontFamilies[i].IsStyleAvailable(FontStyle.Regular)) familyList[i].Font = new Font(fontFamilies[i], 12); 
else if (fontFamilies[i].IsStyleAvailable(FontStyle.Bold)) familyList[i].Font = new Font(fontFamilies[i], 12, FontStyle.Bold); 
else if (fontFamilies[i].IsStyleAvailable(FontStyle.Italic)) familyList[i].Font = new Font(fontFamilies[i], 12, FontStyle.Italic); 
else if (fontFamilies[i].IsStyleAvailable(FontStyle.Strikeout)) familyList[i].Font = new Font(fontFamilies[i], 12, FontStyle.Strikeout); 
else if (fontFamilies[i].IsStyleAvailable(FontStyle.Underline)) familyList[i].Font = new Font(fontFamilies[i], 12, FontStyle.Underline); 
else familyList[i].BackColor = Color.Red; 

不完全是非常漂亮的代碼。之後,我的機器上安裝的大多數字體(很多自定義字體)都可以正常工作。所有這些樣式中唯一失敗的是「Blade Runner Movie Font Bold Italic」,這是一種默認字體。

然而,我們實際上可以修復它!然後我們希望沒有其他字體對它的風格更加殘暴。其他塊被取代:

else try { 
    familyList[i].Font = new Font(fontFamilies[i], 12, FontStyle.Bold | FontStyle.Italic); 
} catch { 
    familyList[i].BackColor = Color.Red; 
} 

而繁榮,所有的字體顯示正確!使用Try-catch是因爲我們無法預先檢查是否可以開始工作。如果出現問題,catch-block仍然會發出警告。與我的字體,文件夾中安裝的字體感謝https://stackoverflow.com/a/5350706/2532489

交叉檢查表明,一些字體是乾脆沒有。

到目前爲止,我還沒有找到一個滿意的解決方案,使所有字體,找到至少一個可能的風格甚至所有樣式的安裝字體。沒有任何構造函數可能需要字體樣式的字符串參數(Ultra,Condensed,Black,Light,Narrow ....)似乎存在。

https://stackoverflow.com/a/4662434/2532489可能有幫助,但目前我不能說肯定。

相關問題