Индивидуальное заполнение символов в XAML
Вопрос
Есть ли в XAML способ добавить отступы вокруг отдельных символов?Желательно до и после персонажа.
У меня есть текстовое поле, в котором я хотел бы, чтобы ввод был немного больше (чтобы он совпадал с фоновым изображением).Было бы идеально иметь возможность сделать что-то вроде:
Есть идеи, как это можно сделать?
Похоже, это можно сделать в MS-Word (подробнее здесь), так что, надеюсь, это означает, что это возможно в XAML?
Решение
Регулировка межсимвольного интервала возможна в XAML с помощью Глифы класс, в частности Индексы свойство.Это довольно низкоуровневый текстовый API, поэтому вам нужно указать URI шрифта (а не фамилию), и вам нужно самостоятельно рассчитать все интервалы.
Следующий XAML использует Glyph.Indices для применения межсимвольного интервала:
<Glyphs UnicodeString="Expanded" Indices=",100;,100;,100;,100;,100;,100;,100"
FontUri="file://c:/windows/fonts/arial.ttf"
Fill="Black" FontRenderingEmSize="24" />
<Glyphs UnicodeString="Normal"
FontUri="file://c:/windows/fonts/arial.ttf"
Fill="Black" FontRenderingEmSize="24" />
<Glyphs UnicodeString="Condensed" Indices=",60;,50;,50;,50;,45;,50;,40;,45"
FontUri="file://c:/windows/fonts/arial.ttf"
Fill="Black" FontRenderingEmSize="24" />
Как задокументировано здесь, свойство Indices содержит список значений, разделенных точкой с запятой. chr,off
пары. chr
— индекс глифа в шрифте;если этот параметр опущен, WPF будет использовать глиф, соответствующий текущему символу в UnicodeString
. off
расстояние между этим глифом и следующим;При значении 0 они отображаются друг над другом, любое положительное значение увеличивает интервал.«Нормальный» интервал будет зависеть от используемого вами шрифта;как вы можете видеть в примере «Сжатый», я использовал разные интервалы для разных пар символов, чтобы результат выглядел лучше.
Очевидно, что это относится только к статическому тексту, который вы отображаете, а не к вводу, полученному от пользователя (в TextBox
);Я не знаю способа настроить межсимвольное расстояние в «стандартных» текстовых объектах (TextBlock
, TextBox
, Run
, и т. д.), поэтому, возможно, ответ будет: «Нет, в XAML это невозможно сделать».