Как указать интервал букв или кернинг в текстовом поле WPF?

Я хотел бы изменить интервал между символами в текстовом поле WPF.
Что-то вроде letter-spacing: 5px, которое доступно в CSS.
Я думаю, что это возможно в XAML; какой самый простой способ?

Я нашел документ Введение в объект GlyphRun Object и Glyphs Element и нашел его чрезвычайно бесполезным.

Это пример кода с этой страницы:

<!-- "Hello World!" with explicit character widths for proportional font -->
<Glyphs 
   FontUri             = "C:\WINDOWS\Fonts\ARIAL.TTF"
   FontRenderingEmSize = "36"
   UnicodeString       = "Hello World!"
   Indices             = ",80;,80;,80;,80;,80;,80;,80;,80;,80;,80;,80"
   Fill                = "Maroon"
   OriginX             = "50"
   OriginY             = "225"
/>

На той же странице документации это "объяснение" для свойства Indices:

enter image description here

Я понятия не имею, что это значит. Я также не уверен, что индексы правильные - комментарий в коде говорит о "ширине символов", который мне неинтересен. Я хочу настроить ширину между символами.

Кроме того, нет примера, как применить элемент Glyphs к TextBox. Когда я попробовал, мое тестовое приложение WPF просто разбилось.


Что я хочу сделать, это немного увеличить пустое пространство, которое появляется между рисунками в текстовом поле WPF TextBox. Текст будет отличаться по длине и контенту. Нужно ли изменять свойство Indicies каждый раз, когда появляется новый символ? Есть ли способ сказать "сделать это на 20% больше места, чем обычно, для каждого персонажа".

Может кто-нибудь мне помочь?

Ответ 1

Я пробовал Glyphs и FontStretch и не мог легко получить результат, который я искал. Я смог придумать подход, который работает для моих целей. Возможно, это сработает и для других.

<ItemsControl ItemsSource="{Binding SomeString}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" 
                       Margin="0,0,5,0"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Я могу привязываться к любой строке и не нужно делать какое-либо распознавание ширины символов, чтобы правильно установить интервал. Правильный край - это пробел между буквами.

Пример:

Kerning

Ответ 2

FontStretch вариант для вас?

В противном случае вы можете посмотреть это, есть изображение, показывающее, что означает предварительная ширина. Хотя я еще не делал этого раньше и не знаю, будет ли это работать увеличение правого и левого боковых подшипников, возможно, это то, что вы хотите!

Ответ 3

За что его стоит.,.

Если у вас есть возможность переключить свою реализацию на RichTextBox, это может быть проще, чем обход, который вы обнаружили в сентябре 2013 года. Я просто попробовал это для своих нужд, и он работает для того, что мне нужно. Я не вижу пути с RichTextBox для контроля кернинга отдельных пространств, таких как наборщики. Но TextBox ест дополнительные пространства (объединение нескольких смежных пространств в одно пространство), как HTML. Мне нужно, чтобы пробелы отображали такое же количество интервалов, что и в моем тексте String, и RichTextBox делает это.

<RichTextBox x:Name="MyRichTextBox"></RichTextBox>

Я не эксперт, но, похоже, вы не можете указать текстовое содержимое в XAML. Я должен был указать его в событии с кодом:

this.MyRichTextBox.AppendText("V A R I E D      S P A C E S");