【问题标题】:WPF Get element at specific coordinatesWPF获取特定坐标处的元素
【发布时间】:2014-02-02 19:21:35
【问题描述】:

我在 Canvas 中有标签,我需要获取与坐标 X、Y 相交的标签吗?

谢谢!!

【问题讨论】:

  • 相对于画布的坐标?窗户?屏幕?相对于左上角?左下方?其他?

标签: c# wpf coordinate-systems


【解决方案1】:

只需在画布上使用InputHitTest,将所需的坐标作为参数传递。请注意,InputHitTest 在每个 UIElement 上都可用,并且不特定于画布。

【讨论】:

  • 如果 X、Y 点与多个子节点重叠,我认为这不会获取所有元素。
  • 你是对的,这不是(问题暗示虽然“获取标签”但不需要它)。但是,它将考虑边距和 z 顺序、布局舍入,...
  • 是的。为简单起见 +1。
  • 您可以使用 WPF 中的 HitTesting 来遍历多个项目,即使它们重叠。您将 VisualTreeHelper.HitTest 与回调一起使用。例如,看看这个 SO 答案的命中测试代码:stackoverflow.com/questions/6410146/…
  • @Nathan:虽然受到我在之前评论中提到的问题的影响。
【解决方案2】:

Canvas.GetLeft(element), Canvas.GetTop(element) 将为您提供任何元素的位置。使用 ActualWidth 和 ActualHeight 形成完整的矩形。您可以使用 foreach 遍历 Canvas 的子项。

编辑: CodeNaked 指出元素可能使用 SetRight 或 SetBottom 设置,因此我修改了示例代码:

foreach (FrameworkElement nextElement in myCanvas.Children)
{
    double left = Canvas.GetLeft(nextElement);
    double top = Canvas.GetTop(nextElement);
    double right = Canvas.GetRight(nextElement);
    double bottom = Canvas.GetBottom(nextElement);
    if (double.IsNaN(left))
    {
        if (double.IsNaN(right) == false)
            left = right - nextElement.ActualWidth;
        else
            continue;
    }
    if (double.IsNaN(top))
    {
        if (double.IsNaN(bottom) == false)
            top = bottom - nextElement.ActualHeight;
        else
            continue;
    }
    Rect eleRect = new Rect(left, top, nextElement.ActualWidth, nextElement.ActualHeight);
    if (myXY.X >= eleRect.X && myXY.Y >= eleRect.Y && myXY.X <= eleRect.Right && myXY.Y <= eleRect.Bottom)
    {
        // Add to intersects list
    }
}

【讨论】:

  • 您假设 OP 没有使用 Right 或 Bottom 附加属性。
  • @CodeNaked:问题中的 cmets 根据左上角查看他们正在查看的状态。
  • @Scott - 评论说 X/Y 坐标是相对于左上角的,而不是说他使用的是 Top 和 Left 附加属性。无论哪种方式,我都对这个答案投了赞成票,因为它符合要求。
  • @AresAvatar - 呃,不是的。每个附加属性在 Canvas.ArrangeOverride 中的使用方式不同。设置 Right 附加属性不会影响 Left 属性。
  • 谢谢!我想知道为什么WPF中没有像hitTest这样的功能!
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多