在.NET应用程序中嵌入/部署自定义字体

时间:2010-06-09 16:27:58

标签: .net winforms deployment fonts

是否有官方方法使用.NET应用程序分发(部署)特定字体?

我们有一个(公共领域)“LED字体”,用复古的LED仪表面打印数字。这是一种标准的True Type或Open Type字体,除了它看起来很时髦之外。

显然,为了工作,这个字体需要在用户的机器上。但我们宁愿不强迫用户“将我们的特殊字体安装到您的字体文件夹中”。我们更喜欢直接从TTF加载Font对象,或者以编程方式安装字体以便它可用。

应用程序如何处理这类事情?例如,我注意到Adobe XYZ在系统上安装了各种字体而无需用户干预。这就是我们想要做的事情。

编辑:好的,理想情况下,我们更喜欢直接安装字体。我们不希望我们漂亮的主题LED字体显示在用户的MS Word字体下拉列表中。我们更喜欢使用此字体,但限制其使用或外观到我们的应用程序。有什么办法吗?

编辑2:这适用于WinForms .NET 2.0应用程序。

谢谢!

2 个答案:

答案 0 :(得分:14)

我在asp.net网站上为自定义图形库使用自定义字体,但是 也可以在winform上运行而不会出现问题。您只需指定font-file,font-size和font-style,并返回font-type。

public static LoadedFont LoadFont(FileInfo file, int fontSize, FontStyle fontStyle)
{
    var fontCollection = new PrivateFontCollection();
    fontCollection.AddFontFile(file.FullName);
    if (fontCollection.Families.Length < 0)
    {
        throw new InvalidOperationException("No font familiy found when loading font");
    }

    var loadedFont = new LoadedFont();
    loadedFont.FontFamily = fontCollection.Families[0];
    loadedFont.Font = new Font(loadedFont.FontFamily, fontSize, fontStyle, GraphicsUnit.Pixel);
    return loadedFont;
}

LoadedFont是一个简单的结构

public struct LoadedFont
{
    public Font Font { get; set; }
    public FontFamily FontFamily { get; set; }
}

这是为了防止FontFamily被GC和字体不起作用(asp.net,我不知道winform上是否需要它)。

答案 1 :(得分:3)

对于WPF应用,您可以将其添加为资源。

请参阅here

您只需将构建操作设置为资源,然后按如下方式引用它:

<TextBlock FontFamily="./Resources/#Custom Font Name">