Встраивание/развертывание пользовательского шрифта в приложении .NET

Есть ли официальный способ распространения (развертывания) определенного шрифта с помощью приложения .NET?

У нас есть (public domain) "LED-шрифт", который печатает цифры с помощью ретро-инструментального вида. Это стандартный шрифт True Type или Open Type, как и любой другой, кроме того, что он выглядит напуганным.

Очевидно, что для работы этот шрифт должен находиться на пользовательской машине. Но мы предпочли бы не принуждать пользователя "устанавливать наш специальный шрифт в папку шрифтов". Мы предпочли бы либо загружать объект Font непосредственно из TTF, либо программно устанавливать шрифт, чтобы он был доступен.

Как приложения обрабатывают такие вещи? Например, я заметил, что Adobe XYZ устанавливает различные шрифты в системе без вмешательства пользователя. Это то, что мы хотели бы сделать.

EDIT: хорошо, в идеале, мы бы предпочли не устанавливать шрифт напрямую. Мы не хотим, чтобы наш элегантный светодиодный шрифт появлялся в раскрывающемся списке шрифтов пользователя в MS Word. Мы предпочли бы использовать этот шрифт, но ограничиваем его использование или внешний вид в нашем приложении. Любой способ сделать это?

EDIT 2: это для приложения WinForms.NET 2.0.

Спасибо!

Ответы

Ответ 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'ed, а шрифт не работает (asp.net, я не знаю, требуется ли это для winform).

Ответ 2

Для приложения WPF вы можете добавить его в качестве ресурса.

Смотрите здесь

Вам просто нужно установить действие сборки на ресурс, а затем ссылаться на него следующим образом:

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