【问题标题】:Obtaining caret position in TextBox获取文本框中的插入符号位置
【发布时间】:2009-12-17 11:48:10
【问题描述】:

如何在 TextBox 控件的可见客户区域中获取插入符号位置 (x, y)?我需要在文本框中添加自动完成功能。

我找到了solution for WPF,但它不能在 Silverlight 中应用。

【问题讨论】:

    标签: silverlight


    【解决方案1】:
    public class AutoCompleteTextBox : TextBox
    {
        public Point GetPositionFromCharacterIndex(int index)
        {
            if (TextWrapping == TextWrapping.Wrap) throw new NotSupportedException();
    
            var text = Text.Substring(0, index);
    
            int lastNewLineIndex = text.LastIndexOf('\r');
    
            var leftText = lastNewLineIndex != -1 ? text.Substring(lastNewLineIndex + 1) : text;
    
            var block = new TextBlock
                            {
                                FontFamily = FontFamily,
                                FontSize = FontSize,
                                FontStretch = FontStretch,
                                FontStyle = FontStyle,
                                FontWeight = FontWeight
                            };
    
            block.Text = text;
            double y = block.ActualHeight;
    
            block.Text = leftText;
            double x = block.ActualWidth;
    
            var scrollViewer = GetTemplateChild("ContentElement") as ScrollViewer;
    
            var point = scrollViewer != null
                            ? new Point(x - scrollViewer.HorizontalOffset, y - scrollViewer.VerticalOffset)
                            : new Point(x, y);
            point.X += BorderThickness.Left + Padding.Left;
            point.Y += BorderThickness.Top + Padding.Top;
    
            return point;
        }
    }
    

    【讨论】:

      【解决方案2】:

      除了altso's answer之外,我想提一下,您实际上需要在块上调用.Measure().Arrange()方法才能使.ActualHeight.ActualWidth工作,例如,像这样(参数可能因您的用例而异):

       block.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
       block.Arrange(new Rect(0, 0, block.DesiredSize.Width, block.DesiredSize.Height));
       double y = block.ActualHeight;
      

      这是在 WPF 中必需,在 Silverlight(包括 SL5)中建议。否则,您最终会在 WPF 中的 ActualHeight 中得到 0,在 Silverlight 中得到奇怪的数字(在我的例子中,这些是围绕 all 文本的边界框的坐标)。


      作为一个单独的解决方案,您可以使用FormattedText 类来做同样的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 2010-10-05
        相关资源
        最近更新 更多