2010-06-09 97 views
12

是否有正式的方式来分发(部署).NET应用程序的特定字体?在.NET应用程序中嵌入/部署自定义字体

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

很明显,要工作,这种字体需要在用户的机器上。但我们不希望强制用户“将特殊字体安装到您的字体文件夹中”。我们希望直接从TTF加载Font对象,或者以编程方式安装字体,以便它可用。

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

编辑:好吧,最好,我们宁愿不是直接安装字体。我们不希望我们漂亮的主题LED字体出现在MS Word中用户的字体下拉列表中。我们倾向于使用此字体,但将其用途或外观限制在我们的应用程序中。任何方式来做到这一点?

编辑2:这是一个WinForms .NET 2.0应用程序。

谢谢!

回答

14

我使用自定义字体为我定制的图形库上asp.net网站,但这应该也没有问题的WinForm上工作。您只需指定字体文件,字体大小和字体样式,并返回字体类型。

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'ed和字体不工作(asp.net,我是否需要它不知道WinForm的)。

+0

谢谢,甚至不知道那里*是* PrivateFontFamily类,应该这样做 – 2010-06-09 18:01:32

+0

不错,请评论它是否真的有效:) – Duckie 2010-06-09 18:59:38

+0

它的工作原理。至少用我刚刚试过的测试字体。看来这是这些类的确切目的。 :) – 2010-06-09 19:32:08

3

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

here

你只需要设置生成操作的资源,然后引用它,如下所示:

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

+0

谢谢。 Upvoted。我希望可以*使用* WPF。不幸的是,这个应用程序是直Winforms。 – 2010-06-09 17:29:52

+0

伟大的提示!但它不适用于我:(我有现在我试图引用通过添加seguisym.ttf,然后编写我尝试了BuildAction:资源,嵌入式资源和内容,但没有一个能够工作。本手册包含的原因是Windows 8有一个更新版本的字体,并且在运行Windows 7的客户端上还需要多个图标。 – 2015-01-11 23:30:31