Как указать межбуквенный интервал или кернинг в текстовом поле WPF? - PullRequest
12 голосов
/ 30 апреля 2011

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

Я нашел документ " Введение в объект GlyphRun и элемент глифов " и обнаружил, что он чрезвычайно бесполезен.

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

<!-- "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.Текст будет различаться по длине и содержанию.Нужно ли изменять свойство Indicies каждый раз, когда появляется новый персонаж?Есть ли способ сказать «сделай на 20% больше места, чем обычно, для каждого персонажа».

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

Ответы [ 3 ]

17 голосов
/ 18 сентября 2013

Я пробовал 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

1 голос
/ 30 апреля 2011

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

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

0 голосов
/ 05 мая 2014

Для чего это стоит. , .

Если у вас есть возможность переключить вашу реализацию на 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");
...