无法让GetPositionFromPoint正常工作(WPF, C#)

问题描述 投票:0回答:1

我正在尝试使用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;
}

谢谢你!

c# .net wpf xaml
1个回答
1
投票

当你对一个特定控件内的坐标感兴趣时,你必须计算相对于这个控件的位置。如果计算相对于其他控件的位置,就会与目标控件不匹配。

例如:你有一个小 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.