如何在TextBox控件的可见客户端区域中获取插入位置(x,y)?我需要在文本框中添加自动完成功能。
我找到solution for WPF,但无法在Silverlight中应用。
答案 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
类来执行相同的操作。