Типографика в целом и шрифты в частности — довольно сложная тема, которой я не особо увлекаюсь. Тем не менее, вот что я понял из Типографика в Windows Presentation Foundation и соответствующая документация MSDN:
- Текст рендерится с помощью конвейера рендеринга текста (схему см. по ссылке выше).
- WPF facilitates OpenType as an extension of the TrueType font format.
- The
Typography object exposes many of the advanced features of OpenType fonts.
- Важной концепцией рендеринга текста низкого уровня является элемент
Glyphs, см. введение.
Если вы посмотрите на упомянутую диаграмму конвейера рендеринга текста, вы заметите, что хотя глифы являются строительными блоками, с ними можно воздействовать различными способами (фильтровать/преобразовывать/...), прежде чем они будут окончательно отображены на определенном носителе, например. экран или принтер; одним из примеров может быть применение ClearType для ЖК-экранов. Однако, как это обычно бывает с концепциями конвейерной обработки, в целом эти преобразования более или менее необязательны.
Теперь, в зависимости от требований вашего приложения, это уже может дать решение. Если вам действительно не нужен TextBox, вы можете просто использовать Glyphs сами по себе, например:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Grid>
<TextBox Text="TextBox: 1234567890" FontFamily="Scramble" FontSize="12" />
<Glyphs UnicodeString="Glyphs: 1234567890" FontUri="C:\WINDOWS\Fonts\Scramble.TTF"
FontRenderingEmSize="12" Fill="Black" OriginX="5" OriginY="32"/>
</Grid>
</Page>
Элемент Glyphs отображает пустые плитки для чисел по желанию, а элемент TextBox — нет. Обратите внимание, что из-за того, что глифы являются низкоуровневым элементом, применяются некоторые ограничения, в частности, требуются все параметры FontUri/Fill/FontRenderingEmSize, т. е. нет значений по умолчанию, как для связанных свойств TextBox.
Имея все это в виду, вернемся к вашему первоначальному вопросу: я бы не стал думать о проблеме как об ограничении WPF (или даже об ошибке), а скорее о влиянии требований к рендерингу текста и значений по умолчанию, применяемых в контексте пользовательского интерфейса WPF. макет. Например. составной (т. е. не низкоуровневый) элемент управления TextBox применяет параметры форматирования текста и типографики к его содержимому (глифам), упрощая работу с различными таблицами сопоставления символов, встроенными в шрифты (потенциально существуют множество из них...); специальные/упрощенные шрифты, такие как Scramble, могут просто не предоставить здесь достаточной или правильной информации, следовательно, механизм рендеринга WPF может быть вынужден применить откат шрифта как уже описаны GalacticCowboy.
Если это действительно так, возможно, можно каким-то образом переопределить алгоритм рендеринга WPF по умолчанию (см. class TextFormatter, текстовый движок WPF), но, вероятно, потребуется довольно глубоко изучить структуру, чтобы понять, что происходит внутри TextBox. Вероятно, гораздо проще «отладить» отсутствующие или неправильные сопоставления символов в шрифте Scramble. Хотя это было бы совсем другое дело...
person
Steffen Opel
schedule
13.07.2009