Задача элементарна, показать в комбобоксе все установленные шрифты для использования в 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?
Здравствуйте, 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/
Здравствуйте, 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 показывает обычный список, который мне и нужен
Здравствуйте, HotDog, Вы писали:
HD>Но как они его получают
Blend же вроде managed. Залезь в исходники Reflector-ом каким-нибудь. Наверное, через EnumFontFamiliesEx получают. Как это потом ложится на WPF, к сожалению, не подскажу.
Здравствуйте, 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». С рефлектором я потихоньку ковыряюсь в нем, но там черт ногу сломает.
Здравствуйте, 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 возможных.
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, HotDog, Вы писали:
MM>>>Blend же вроде managed. Залезь в исходники Reflector-ом каким-нибудь. Наверное, через EnumFontFamiliesEx получают. Как это потом ложится на WPF, к сожалению, не подскажу.
HD>Может быть кому то будет интересно как это делается "по майкрософтовски" то бишь в Blend. HD> ... HD>По моей шкале говнокода это получает 10 раджикумаров из 10 возможных.
Ну для первой версии было не плохо. А теперь все так потому что
HD> пользователь хочет видеть то, что показывает WinWord.