当您对特定控件内的坐标感兴趣时,您必须计算相对于该控件的位置。如果计算相对于其他一些控件位置的位置将与目标控件不匹配。
示例:您在一个大Window 中有一个小TextBox,并且您对TextBox 中的坐标感兴趣。你所做的,你计算了相对于大Window 的所有位置。现在假设尺寸为 12 * 12 的 TextBox 位于 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。该坐标现在位于 TextBox 的 12 * 12 范围内,您可以在此处点击渲染文本框。
以下示例显示了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;
}