WPF. Fonts enumeration
От: HotDog Швейцария www.denebspace.com
Дата: 23.11.16 14:32
Оценка:
Задача элементарна, показать в комбобоксе все установленные шрифты для использования в RichTextBox.

— (1) Как референс — WinWord показывает на машине 331 шрифт доступный для выбора.
— (2) Если я получаю фонты через System.Drawing.Text.InstalledFontCollection() то возвращается 311 значение.
— (3) System.Windows.Media.Fonts.SystemFontFamilies() возвращает коллекцию из 271 FontFamilies.

Проблемы:
— В коллекции (3) отсутствуют такие фонты как „Arial Black“, „Arial Narrow“ и куча других шрифтов в названии которых есть дополнения типа Black, Thin, Light и т.п.
— Если как отправную точку брать коллекцию (2) то там некоторые фонты называются иначе. К примеру «John Handy LET» (http://www.myfontfree.com/john-handy-let-myfontfreecom126f36883.htm) в коллекции (3) идет под названием «John Handy LET Plain» и именно такое название нужно кидать WPF, что бы он создал этот фонт.
— В любом случае мы не дотягиваем до полной коллекции установленных шрифтов.

Кто-нибудь решал подобную проблему? Как получить самый полный и правильный список установленных шрифтов для использования в WPF?
Отредактировано 10.01.2017 5:54 AndrewVK . Предыдущая версия .
wpf
Re: WPF. Fonts enumeration
От: karbofos42 Россия  
Дата: 24.11.16 05:16
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Задача элементарна, показать в комбобоксе все установленные шрифты для использования в RichTextBox.


HD>- (1) Как референс — WinWord показывает на машине 331 шрифт доступный для выбора.

HD>- (2) Если я получаю фонты через System.Drawing.Text.InstalledFontCollection() то возвращается 311 значение.
HD>- (3) System.Windows.Media.Fonts.SystemFontFamilies() возвращает коллекцию из 271 FontFamilies.

HD>Проблемы:

HD>- В коллекции (3) отсутствуют такие фонты как „Arial Black“, „Arial Narrow“ и куча других шрифтов в названии которых есть дополнения типа Black, Thin, Light и т.п.
HD>- Если как отправную точку брать коллекцию (2) то там некоторые фонты называются иначе. К примеру «John Handy LET» (http://www.myfontfree.com/john-handy-let-myfontfreecom126f36883.htm) в коллекции (3) идет под названием «John Handy LET Plain» и именно такое название нужно кидать WPF, что бы он создал этот фонт.
HD>- В любом случае мы не дотягиваем до полной коллекции установленных шрифтов.

HD>Кто-нибудь решал подобную проблему? Как получить самый полный и правильный список установленных шрифтов для использования в WPF?


В WPF немного другая схема идёт. Arial — не шрифт, а семейство шрифтов. Arial Narrow — не отдельное что-то, а один из typeface Arial. Есть у Arial typeface обычный, полужирный, Narrow, Black,...
Вот пример нагуглился: https://blogs.msdn.microsoft.com/text/2006/10/31/sample-font-chooser/
Re[2]: WPF. Fonts enumeration
От: HotDog Швейцария www.denebspace.com
Дата: 24.11.16 09:35
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>В WPF немного другая схема идёт. Arial — не шрифт, а семейство шрифтов. Arial Narrow — не отдельное что-то, а один из typeface Arial. Есть у Arial typeface обычный, полужирный, Narrow, Black,...

K>Вот пример нагуглился: https://blogs.msdn.microsoft.com/text/2006/10/31/sample-font-chooser/

Я в курсе этих замечательных фич Но пользователь хочет видеть то, что показывает WinWord. Тот же Blend for VS показывает обычный список, который мне и нужен


Но как они его получают
Re[3]: WPF. Fonts enumeration
От: MxMsk Португалия  
Дата: 24.11.16 10:42
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Но как они его получают

Blend же вроде managed. Залезь в исходники Reflector-ом каким-нибудь. Наверное, через EnumFontFamiliesEx получают. Как это потом ложится на WPF, к сожалению, не подскажу.
Re[4]: WPF. Fonts enumeration
От: HotDog Швейцария www.denebspace.com
Дата: 24.11.16 12:24
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, HotDog, Вы писали:


MM>Blend же вроде managed. Залезь в исходники Reflector-ом каким-нибудь. Наверное, через EnumFontFamiliesEx получают. Как это потом ложится на WPF, к сожалению, не подскажу.


EnumFontFamiliesEx я уже сам проверил, через него получаем тот же сет фонтов что и через WinForm (System.Drawing.Text.InstalledFontCollection). И он так же возвращает «John Handy LET» для фонта http://www.myfontfree.com/john-handy-let-myfontfreecom126f36883.htm. Но для WPF мне нужно указать «John Handy LET Plain». Blend в своем списке фонтов правильно показывает «John Handy LET Plain». С рефлектором я потихоньку ковыряюсь в нем, но там черт ногу сломает.
Отредактировано 24.11.2016 12:25 HotDog . Предыдущая версия . Еще …
Отредактировано 24.11.2016 12:24 HotDog . Предыдущая версия .
Re[5]: WPF. Fonts enumeration
От: HotDog Швейцария www.denebspace.com
Дата: 24.11.16 16:40
Оценка: 33 (6) +1 :)
Здравствуйте, HotDog, Вы писали:

MM>>Blend же вроде managed. Залезь в исходники Reflector-ом каким-нибудь. Наверное, через EnumFontFamiliesEx получают. Как это потом ложится на WPF, к сожалению, не подскажу.


Может быть кому то будет интересно как это делается "по майкрософтовски" то бишь в Blend.

— Идем в Path.Combine(Environment.GetEnvironmentVariable("windir"), "Fonts") и получаем списов всех файлов там лежащих
— В каждом найденном файле пытаемся получить Typeface через Fonts.GetTypefaces(file)
— У каждого найденного typeface получаем gdiName: typeface.TryGetGlyphTypeface()
— У каждого найденного typeface пытаемся получить wpfName: fontFamily = new FontFamily(filePath + "#" + gdiName), если не получилось, то откатываемся на gdiName
— Заталкиваем в dictionary, Profit!

По моей шкале говнокода это получает 10 раджикумаров из 10 возможных.
Re[6]: WPF. Fonts enumeration
От: Loooser Россия  
Дата: 10.01.17 11:40
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Здравствуйте, HotDog, Вы писали:


MM>>>Blend же вроде managed. Залезь в исходники Reflector-ом каким-нибудь. Наверное, через EnumFontFamiliesEx получают. Как это потом ложится на WPF, к сожалению, не подскажу.


HD>Может быть кому то будет интересно как это делается "по майкрософтовски" то бишь в Blend.

HD> ...
HD>По моей шкале говнокода это получает 10 раджикумаров из 10 возможных.

Ну для первой версии было не плохо. А теперь все так потому что

HD> пользователь хочет видеть то, что показывает WinWord.


Порви эту цепочку первым!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.