2011-04-30 916 views
11

我想修改WPF文本框中字符之间的间距。
类似于letter-spacing: 5px的东西,可在CSS中使用。
我认为这是可能的在XAML;最简单的方法是什么?如何在WPF文本框中指定字母间距或字距?

我找到了“Introduction to the GlyphRun Object and 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元素应用到文本框没有实例。当我尝试它时,我的WPF测试应用程序刚刚崩溃。


我想要做的是稍微增加WPF文本框中绘制字符之间出现的空白空间。文本的长度和内容会有所不同。每当有新角色时,我是否必须修改Indicies属性?有没有办法说“让每个角色的空间比平时多出20%”。

任何人都可以帮助我吗?

回答

14

我试图字形和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

+0

这是一个不错的解决方案(我投了票),但这肯定会导致性能问题。我们在一些地方使用了这个解决方案,但是我们想在具有几百个项目的'ItemsControl'中使用它,并且它在渲染时间中添加了多个秒。在这些情况下,我们回到了常规的“TextBlock”。所以请注意/小心! – 2014-12-11 20:23:53

+0

这也会打破修剪或换行文字的能力。 – Walkor 2017-06-12 16:47:37

0

FontStretch一个选择?

否则,你可能要考虑this有一个形象,展示了超前宽度意思。虽然我以前没有这样做过,也不知道这是否会增加右侧和左侧的轴承可能是你想要的!

-1

为了什么它的价值。 。 。

如果你必须选择你的实现RichTextBox的选项,这可能是比工作在你身边发现2013年九月我只是想为我自己的需要和它的作品为我所需要的更容易。我没有看到用RichTextBox来控制像排字器那样的单独空间的方式。但TextBox正在吃更多的空间(将多个相邻的空间合并到一个空间),比如HTML。我需要空格显示与我的文本字符串中相同数量的空格,并且RichTextBox执行此操作。

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

我不是专家,但它似乎无法在XAML中指定文本内容。我必须在代码隐藏事件中指定它:

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