代码之家  ›  专栏  ›  技术社区  ›  Serge Wautier

WPF文本块:如何均匀地分配显示的字符?

  •  4
  • Serge Wautier  · 技术社区  · 15 年前

    我需要显示一个每x像素显示一个字符的字符串。(x与整个字符串交叉)。

    例如:“Hello”->H位于位置(像素)0,E位于位置50,L位于100,L位于150,O位于200。

    当然,我可以为每个字符使用一个文本块,但它似乎有点多余。

    translateTransform似乎没有做到这一点:它将我的角色相对偏移到前一个角色的末尾,这不是我想要的。

    TIA为您提供帮助。

    2 回复  |  直到 10 年前
        1
  •  6
  •   Tim Cooper    13 年前

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

    下面的代码演示了如何编写自己的控件来为您执行此操作。它是不高效的,它可以通过调整来实现,包括更多的属性来控制字体等,但是你会得到这样的想法:

    空格文本块.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;
                }
            }
        }
    }
    

    Windows 1.xAML 以下内容:

    <local:SpacedTextBlock Text="Hello"/>
    

    结果:

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

        2
  •  2
  •   Scott    15 年前

    我想这取决于你的具体情况,这是否有效。 但是你能不能在每个字母之间加上空格,并将文本对齐方式设置为对齐?

    不幸的是,如果你需要这样的像素,你就不能这样设置像素。但是这样可以得到均匀的间距。如果这不仅仅是窗口上的一个点,或者对动态文本来说有点复杂…然后,您可能需要寻找一个更优雅的解决方案。