FontFamily问题

时间:2008-12-12 07:34:27

标签: winforms

为什么Font对象的FontFamily参数是字符串而不是枚举?

2 个答案:

答案 0 :(得分:4)

FontFamily是指Font的名称。虽然你可以使用“monospace”或“serif”,但我认为它不会得到.Net的支持。

请记住,使用枚举是不可能的。枚举是静态编译时功能,这意味着它无法从系统上的字体动态“生成”枚举。实际上,在语言中包含任何特定内容可能都是一个糟糕的主意。即使支持这种情况,用户的机器也不会拥有与您相同的字体 - 某些字体将被错误地包含在列表中,而一些字体将被排除(因为一旦编译枚举变为'final')。

枚举是一个方便的积分常量存储,而不是其他。枚举中的每个项目都有一个方便的名称和值,即使您没有指定它。以下两个枚举是相同的。

public enum MyEnum
{
  A = 1,
  B = 2
}

public enum FooEnum
{
  A,
  B
}

还有另外两个问题,枚举名称不能包含空格,字体名称可以包含空格。从枚举中获取字段并不是一项简单的任务(它需要大量的反射代码)。

以下代码将为您提供字体列表(您需要添加System.Drawing作为参考):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing.Text;
    using System.Drawing;

    namespace ConsoleApplication19
    {
        class Program
        {
            static void Main(string[] args)
            {
                InstalledFontCollection ifc = new InstalledFontCollection();

                foreach (FontFamily o in ifc.Families)
                {
                    Console.WriteLine(o.Name);
                }
                Console.ReadLine();
            }
        }
    }

答案 1 :(得分:3)

因为Enum是一组固定值,当它发生变化时会强制重新编译(在这种情况下,这最终意味着:框架的新版本)。

字体系列可能会发生变化,可用字体因主机系统而异。