Не удается заставить GetPositionFromPoint работать нормально (WPF, C#) - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать GetPositionFromPoint, и в документации говорится о snapToText bool, который, если false, "возвращает ноль, если точка не находится внутри ограничительной рамки символа" . В любом случае, я всегда получаю нулевой TextPointer, даже когда моя точка находится на персонаже. Я оставляю здесь свой код, я использую флажок (называемый «проверка»), чтобы увидеть, является ли TextPointer нулевым или нет, и он всегда не проверен:

Point posicion = Mouse.GetPosition(Application.Current.MainWindow);
TextPointer posAhora = richTextBox1.GetPositionFromPoint(posicion, false);
if(posAhora != null)
{
   check.IsChecked = true;
}
else
{
   check.IsChecked = false;
}

Спасибо!

1 Ответ

1 голос
/ 22 апреля 2020

Если вас интересуют координаты внутри указанного 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...