Встраивание/развертывание пользовательского шрифта в приложении .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">