【问题标题】:Embedding/deploying custom font in .NET app在 .NET 应用程序中嵌入/部署自定义字体
【发布时间】:2011-03-01 18:30:13
【问题描述】:

有没有一种官方的方式来使用 .NET 应用程序分发(部署)特定字体?

我们有一个(公共领域的)“LED 字体”,可以打印带有复古 LED 仪表外观的数字。这是一种标准的 True Type 或 Open Type 字体,与其他字体一样,只是看起来很时髦。

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

应用程序如何处理这类事情?例如,我注意到 Adob​​e XYZ 在没有用户干预的情况下在系统上安装了各种字体。这就是我们想要做的。

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

编辑 2:这是针对 WinForms .NET 2.0 应用程序。

谢谢!

【问题讨论】:

    标签: .net winforms deployment fonts


    【解决方案1】:

    我在一个 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 和字体不工作(asp.net,我不知道它是否需要在 winform 上)。

    【讨论】:

    • 谢谢,甚至不知道有 PrivateFontFamily 类。应该这样做。
    • 它有效。至少使用我刚刚尝试过的测试字体。似乎这是这些课程的确切目的。 :)
    • 为什么需要一个结构来防止垃圾收集?只要您持有参考资料,它就永远不会被收集,对吗?
    • 这个字体可以在 WPF XAML 文件中使用还是只在代码中使用?
    【解决方案2】:

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

    here

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

    &lt;TextBlock FontFamily="./Resources/#Custom Font Name"&gt;

    【讨论】:

    • 谢谢。赞成。我真希望我能使用 WPF。不幸的是,这个应用程序是直接的 Winforms。
    • 很棒的提示!!但这对我不起作用:(我有 现在我试图通过添加 seguisym.ttf 然后编写 。我尝试了 BuildAction: Resource、Embedded Resource 和 Content,但它们都不起作用。包含此手册的原因是 Windows 8 具有较新版本的字体,其中包含我在运行 Windows 7 的客户端上也需要的几个图标。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2010-09-26
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多