【问题标题】:Can't get GetPositionFromPoint to work well (WPF, C#)无法让 GetPositionFromPoint 正常工作(WPF、C#)
【发布时间】:2020-04-22 17:59:45
【问题描述】:

我正在尝试使用 GetPositionFromPoint,在文档中它谈到了 snapToText 布尔值,如果为 false,“如果点不在字符的边界框内,则返回 null”。无论如何,我总是收到一个 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;
}

谢谢!

【问题讨论】:

  • 嗨,问题:在什么情况下或如何触发该代码?

标签: c# .net wpf xaml


【解决方案1】:

当您对特定控件内的坐标感兴趣时,您必须计算相对于该控件的位置。如果计算相对于其他一些控件位置的位置将与目标控件不匹配。

示例:您在一个大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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2017-11-06
    • 2011-09-06
    • 1970-01-01
    • 2023-03-10
    • 2020-10-16
    相关资源
    最近更新 更多