在TextBox中获取插入位置

时间:2009-12-17 11:48:10

标签: silverlight

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

我找到solution for WPF,但无法在Silverlight中应用。

2 个答案:

答案 0 :(得分:5)

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;
    }
}

答案 1 :(得分:2)

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

.ActualWidth

这是WPF中的必需,而Silverlight中的建议(包括SL5)。否则你最终会在WPF中的 block.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); block.Arrange(new Rect(0, 0, block.DesiredSize.Width, block.DesiredSize.Height)); double y = block.ActualHeight; 中出现0,在Silverlight中出现奇怪的数字(在我的例子中,这些是围绕所有文本的边界框的坐标)。


作为一个单独的解决方案,您可以使用FormattedText类来执行相同的操作。