【问题标题】:WPF TextBlock: How to evenly space displayed characters?WPF TextBlock:如何均匀间隔显示的字符?
【发布时间】:2009-09-25 09:19:29
【问题描述】:

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

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

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

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

TIA 为您提供帮助。

【问题讨论】:

    标签: wpf textblock


    【解决方案1】:

    我不相信 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"/>
    

    结果:

    alt text http://img199.imageshack.us/img199/8022/screenshotud.png

    【讨论】:

    • 有趣。我将不得不添加更多代码以支持自定义字体和颜色。谢谢。
    【解决方案2】:

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

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

    【讨论】:

    • Scott,您的解决方案具有最佳的快速&肮脏/高效比率。自定义字体等不需要额外的代码。不幸的是,经过一些测试,由于副作用很小,我们不得不放弃它。不过你有我的 +1
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2022-08-03
    • 2019-03-12
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多