Если вас интересуют координаты внутри указанного c элемента управления, вы должны рассчитать положение относительно этого элемента управления. Если вычислить позицию относительно некоторых других контрольных позиций, не совпадет с целевым элементом управления.
Пример: у вас есть маленький 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;
}