【发布时间】:2009-12-17 11:48:10
【问题描述】:
如何在 TextBox 控件的可见客户区域中获取插入符号位置 (x, y)?我需要在文本框中添加自动完成功能。
我找到了solution for WPF,但它不能在 Silverlight 中应用。
【问题讨论】:
标签: silverlight
如何在 TextBox 控件的可见客户区域中获取插入符号位置 (x, y)?我需要在文本框中添加自动完成功能。
我找到了solution for WPF,但它不能在 Silverlight 中应用。
【问题讨论】:
标签: silverlight
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;
}
}
【讨论】:
除了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 类来做同样的事情。
【讨论】: