【问题标题】:Canvas child identification帆布儿童识别
【发布时间】:2013-10-19 18:29:12
【问题描述】:

我有一个名为 Location 的带有 Point 属性的节点类。我创建了这个类的几个对象,然后将它们放在通用列表中。 在我的应用中,每个节点都由图像表示(节点位置 == 图像位置)。

为了渲染图像,我迭代我的节点列表并将图像添加到我的 WPF 主窗口上的 Canvas。基本上,我列表中的第一项是我的 Canvas 的第一个子项。

当我更改节点的位置时,渲染图像时也会自动更改。但是,如果我想使用 MouseMove 事件移动图像,我不知道如何从我的节点列表中访问特定元素。我怎么知道哪个元素是哪个?

【问题讨论】:

  • 您是使用绑定还是直接操作 Canvas?发布您的代码以帮助我们帮助您
  • 我猜你是在代码后面直接操作画布?在这种情况下,请阅读我应用的答案。

标签: c# wpf canvas


【解决方案1】:

由于您以与节点列表中的节点相同的顺序将图像添加到 Canvas,因此您可以简单地获取 Canvas 子索引并通过该索引访问节点:

private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var element = canvas.InputHitTest(e.GetPosition(canvas)) as UIElement;

    if (element != null)
    {
        int index = canvas.Children.IndexOf(element);
        node hitNode = nodelist[index];
    }
}

【讨论】:

  • 你好。您的解决方案正在运行,但是我不得不对其进行一些更改。问题是元素永远不会返回 null,即使我单击空 Canvas IndexOf() 返回 -1。我通过添加额外的 if 语句来处理这个问题。
  • 是的,当在图像外部单击时 InputHitTest 返回 Canvas 实例。如果你真的只有图像控件,你可以写canvas.InputHitTest(...) as Image。如果没有点击图片,它将返回null。当然,检查IndexOf 是否返回-1 总是更安全。
【解决方案2】:

将鼠标单击/拖动/悬停在特定图像上并将其 (0,0) 点转换为画布。

Point relativePoint = image.TransformToAncestor(myCanvas)
                              .Transform(new Point(0, 0));

然后遍历您的列表并找到位置与 relativePoint 相同的图像。

这就是你如何找到捕获鼠标光标的那个。

这也是一篇关于在 wpf 中进行转换的好文章。

http://msdn.microsoft.com/en-us/library/ms750596.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多