Почему новый FontFamily (недопустимый шрифт) не вызывает исключение?

Почему следующий код не генерирует исключение?

FontFamily font = new FontFamily("bla bla bla");

Мне нужно знать, существует ли конкретный font (как комбинация FontFamily, FontStyle, FontWeight,...) в моей текущей ОС. Что мне делать?


person Nick    schedule 08.10.2012    source источник
comment
Должен генерировать исключение согласно msdn.microsoft.com/ru-ru/library/ 2ext31w1.aspx   -  person Artur Udod    schedule 09.10.2012
comment
@Artur Udod: это System.Drawing.FontFamily, который не является частью WPF.   -  person BoltClock    schedule 09.10.2012
comment
@BoltClock, не заметил тег wpf =)   -  person Artur Udod    schedule 09.10.2012


Ответы (4)


Это по дизайну. Программы часто запрашивают шрифты, которых нет на машине, особенно в стране, удаленной от места жительства программиста. Преобразователь шрифтов создает альтернативу. Замена шрифта вообще очень распространена. Вы смотрите на Arial прямо сейчас, если вы работаете на компьютере с Windows. Но я могу вставить 你好世界 в этот пост, и вы увидите, что он отображается точно, хотя в Arial нет глифов для китайских иероглифов.

Итак, совет номер один: не беспокойтесь о том, какие шрифты доступны. API-интерфейс Windows имеет EnumFontFamiliesEx() для перечисления доступных семейств шрифтов. Но это не раскрывается в WPF, есть некоторые трения с OpenType, стандартом шрифта, который довольно плохо интегрирован с Windows. Кажется, еще одна тень, когда Adobe вмешивается во все, что делает Microsoft.

Некоторая путаница в комментариях о классе Winforms FontFamily. Что на самом деле можно использовать в этом случае, его метод GetFamilies() возвращает массив доступных семейств. Но только TrueType, а не OpenType шрифты.

person Hans Passant    schedule 08.10.2012
comment
У меня есть это приложение, которое вылетает без каких-либо исключений, только если оно работает на какой-то машине и только если я установил определенный тип шрифта (например, курсив Nina). Но у него нормальное поведение, когда я запускаю его на другом компьютере или устанавливаю другой шрифт (обычный Nina). Как вы можете объяснить это странное поведение? - person Nick; 09.10.2012

Вы можете использовать класс System.Drawing.Text.InstalledFontCollection

http://msdn.microsoft.com/en-us/library/system.drawing.text.installedfontcollection.aspx

WPF имеет метод, специфичный для фреймворка Fonts.SystemFontFamilies

http://msdn.microsoft.com/en-us/library/system.windows.media.fonts.systemfontfamilies.aspx

person Laurent Bourgault-Roy    schedule 08.10.2012
comment
Но как узнать, существует ли, например, шрифт Nina (курсив и полужирный) с помощью FontFamilies? - person Nick; 09.10.2012

Чтобы ответить на вопрос, почему он не генерирует исключение, в соответствии с FontFamily Constructor в MSDN исключение не добавлялось до версии фреймворка 3.5.

Я подозреваю, что вы ориентируетесь на версию 3.0 или ниже.

Ваше здоровье!

person Jon Peterson    schedule 08.10.2012
comment
Это System.Drawing.FontFamily. Конструктор System.Windows.Media.FontFamily никогда не генерирует исключений, если аргумент не равен null. - person BoltClock; 09.10.2012
comment
Нет, конструктор выдает исключение ArgumentNullException, если аргумент имеет значение null, но в моем случае это не так. - person Nick; 09.10.2012

Вы можете просмотреть доступные шрифты в Системе, используя коллекцию Fonts.SystemFontFamilies — используйте некоторый Linq для соответствия любым условиям, которые вам нужны;

// true
bool exists = (from f in Fonts.SystemFontFamilies where f.Source.Equals("Arial") select f).Any();

// false
exists = (from f in Fonts.SystemFontFamilies where f.Source.Equals("blahblah") select f).Any();
person RJ Lohan    schedule 08.10.2012
comment
Сказав это, ответ Ханса Пассана, вероятно, более уместен. - person RJ Lohan; 09.10.2012