【问题标题】:Setting each ListViewEntry with a different font为每个 ListViewEntry 设置不同的字体
【发布时间】:2014-11-26 03:47:29
【问题描述】:

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

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

列表按预期交替字体。

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

谢谢。

【问题讨论】:

  • 你用什么? WinForms,WPF?
  • WinForms,我猜?它是 Visual Studio 2013 中的 WindowsFormsApplications。

标签: c# fonts


【解决方案1】:

构造函数

new Font(FontFamily fontFamily, Float fontSize);

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

检查 FontStyle-enumerator 可以获得更好的结果:

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-block 被替换为:

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 可能会有所帮助,但目前我不能肯定地说。

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 2017-09-15
    • 2016-03-24
    • 1970-01-01
    • 2014-04-04
    • 2012-06-01
    • 2014-01-14
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多