4

我需要显示一个字符串,每个字符每 x 个像素显示一次。(x 跨越整个字符串)。

例如:“你好”-> H 在位置(像素)0,e 在位置 50,l 在 100,l 在 150,o 在 200。

当然,我可以为每个字符使用一个 TextBlock,但这似乎有点矫枉过正。

TranslateTransform 似乎没有奏效:它使我的字符相对于前一个字符的 END 偏移,这不是我想要的。

TIA 为您提供帮助。

4

2 回答 2

6

我不相信在 WPF 中有内置的功能可以做到这一点,但我可能是错的。

下面的代码演示了如何编写自己的控件来为您执行此操作。它效率不高,它可以通过调整来完成,包括更多属性来控制字体等,但你明白了:

SpacedTextBlock.cs

public class SpacedTextBlock : Control
{
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text",
        typeof(string),
        typeof(SpacedTextBlock));

    public string Text
    {
        get { return GetValue(TextProperty) as string; }
        set { SetValue(TextProperty, value); }
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        if (Text != null)
        {
            var widthPerChar = ActualWidth / Text.Length;
            var currentPosition = 0d;

            foreach (var ch in Text)
            {
                drawingContext.DrawText(new FormattedText(ch.ToString(), CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface("Arial"), 12, Foreground), new Point(currentPosition, 0));
                currentPosition += widthPerChar;
            }
        }
    }
}

Window1.xaml

<local:SpacedTextBlock Text="Hello"/>

结果:

替代文字 http://img199.imageshack.us/img199/8022/screenshotud.png

于 2009-09-25T09:44:43.267 回答
3

我想这取决于您的具体情况,这是否可行。但是您可以在每个字母之间添加空格,并将文本对齐设置为合理吗?

不幸的是,如果您需要的话,您不能以这种方式设置像素数……但您可以通过这种方式获得均匀的间距。如果这不仅仅是您窗口上的一个位置,或者动态文本稍微复杂一点......那么您可能想要寻找一个更优雅的解决方案。

于 2009-09-25T19:25:08.733 回答