我正在尝试使用GetPositionFromPoint,在文档中提到了snapToText bool,如果false。"如果点不在字符的边界框内,则返回null". 总之,我接收到的总是一个空的TextPointer,即使我的Point在一个字符上。我把我的代码留在这里,我使用了一个复选框(称为 "检查")来查看TextPointer是否为空,但它总是没有被选中。
Point posicion = Mouse.GetPosition(Application.Current.MainWindow);
TextPointer posAhora = richTextBox1.GetPositionFromPoint(posicion, false);
if(posAhora != null)
{
check.IsChecked = true;
}
else
{
check.IsChecked = false;
}
谢谢你!
当你对一个特定控件内的坐标感兴趣时,你必须计算相对于这个控件的位置。如果计算相对于其他控件的位置,就会与目标控件不匹配。
例如:你有一个小 TextBox
里边 Window
而你感兴趣的是在 TextBox
. 你所做的,你计算了所有相对于大的位置。Window
. 现在我们说 TextBox
尺寸为12*12的产品被放置在32*32窗口的右下角的位置。x=20;y=20.
________________
| | <--- MainWindow 32 * 32
| |
| _____|
| | |
| | P | <--- TextBox 12 * 12 (x=20;y=20)
|__________|_____|
p = pointer position
鼠标指针现在处于中心位置。TextBox
和你计算。
p = Mouse.GetPosition(Application.Current.MainWindow);
p
是相对于32*32的大窗口计算的,并计算为 x=26;y=26,这是你当前和错误计算的结果。当你使用这个坐标来寻找文本时,在 TextBox
你显然是出界的 TextBox
尺寸只有12*12。
现在正确计算位置。
p = Mouse.GetPosition(TextBox);
p
现在计算的位置是相对于 TextBox
并评价为 x=6;y=6. 现在这个坐标在12*12的范围内。TextBox
,在这里你可以打出渲染文本的框。
下面的例子展示了正确实现 CheckBox
当鼠标指针在输入文本上时,会被检查的 RichtextBox
:
MainWindow.xaml
<Window>
<StackPanel>
<CheckBox x:Name="CheckBox"/>
<!-- Enter some text and move the mouse over the text -->
<RichTextBox x:Name="RichTextBox" />
</StackPanel>
</Window>
MainWindow.xaml.cs。
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
var relativeMousePosition = e.GetPosition(this.RichTextBox);
this.CheckBox.IsChecked = this.RichTextBox.GetPositionFromPoint(relativeMousePosition , false) != null;
}