使用不同的字体设置每个列表视图条目

本文关键字:列表 视图 设置 字体 | 更新日期: 2023-09-27 18:31:53

我正在尝试开发一个字体应用程序。在列表视图中,我列出了所有已安装的字体。现在我想显示用该字体书写的字体名称。

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);

该列表按预期交替字体。

这里可能有什么问题?某些字体是否可能未定义或无法使用,导致整个列表失败?不会引发任何错误。

谢谢。

使用不同的字体设置每个列表视图条目

构造函数

new Font(FontFamily fontFamily, Float fontSize);

自动将字体样式设置为"常规"。但是,并非所有字体实际上都支持常规样式。

通过检查 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;

不是很好的代码。之后,我的机器上安装的大多数字体(许多自定义字体)都可以正常工作。唯一不符合所有这些样式的是"银翼杀手电影字体粗斜体",一种默认字体。

但是,我们实际上可以修复它!然后我们希望没有其他字体对它的样式更残暴。else-block被替换为:

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

繁荣,所有字体都正确显示!之所以使用 try-catch,是因为我们无法提前检查这是否有效。如果出现问题,捕获块仍将发出可见警告。信用 https://stackoverflow.com/a/5350706/2532489

与我在字体文件夹中安装的字体交叉检查显示,某些字体明显丢失。

到目前为止,我还没有找到一个令人满意的解决方案来获取所有字体,找到至少一种可能的样式,甚至是已安装字体的所有样式。似乎不存在可能采用字符串参数(超、压缩、黑色、浅色、窄等)的构造函数。

https://stackoverflow.com/a/4662434/2532489 可能会有所帮助,但目前我不能肯定地说。