Встраивание / развертывание пользовательского шрифта в приложении .NET - PullRequest
12 голосов
/ 09 июня 2010

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

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

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

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

РЕДАКТИРОВАТЬ: хорошо, в идеале , мы бы предпочли , а не для непосредственной установки шрифта. Мы не хотим, чтобы наш стильный светодиодный шрифт отображался в раскрывающемся списке шрифтов пользователя в MS Word. Мы бы предпочли использовать этот шрифт, но ограничить его использование или внешний вид нашим приложением. Есть ли способ сделать это?

РЕДАКТИРОВАТЬ 2: Это для приложения WinForms .NET 2.0.

Спасибо!

Ответы [ 2 ]

14 голосов
/ 09 июня 2010

Я использую пользовательский шрифт для своей пользовательской графической библиотеки на сайте 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).

3 голосов
/ 09 июня 2010

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

См. здесь

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...