4

我想使用拖动矩形来实现多个形状的选择。我在这样的画布上有很多形状: 在此处输入图像描述

这些形状绑定到相应的模型(MVVM)。我的选择矩形看起来像这样: 在此处输入图像描述

当我完成绘制选择矩形(鼠标向上事件),我运行这个代码:

var itemToSelect = ViewModel.ItemsInCanvas.Where((item) =>
{
    // TODO : test each types of shapes to know if the selection rectangle intersects with it
}).ToList();

我有不同种类的形状对象模型:

  • 四边形:我可以(在代码中)获得四个点中每个点的坐标。
  • 三角形:我可以(在代码中)获得三个点中每个点的坐标。
  • 曲线:我可以获得路径数据(作为字符串)。
  • ligne :我可以得到两个点(正弦是同一个对象)
  • 圆圈:我可以得到高度和宽度。

我还可以获得每个形状的顶部和左侧。

所有这些形状都存储在我的主视图模型的列表中:ItemsInCanvas

当我输入上面的代码时,我想测试每个元素以了解它们是否与选择矩形(我知道其坐标)相交。

我的第一次尝试是(仅适用于曲线项目):

var itemToSelect = ViewModel.ItemsInCanvas.Where((item) =>
{
    if (item is CurveItem)
    {
        // I got my Curve Item
        CurveItem curveItem = (item as CurveItem);
        // I got the selection rectangle
        RectangleGeometry SelectionRectangleGeometry = new RectangleGeometry(SelectionRectangle);
        // Is the rectangle intersecting the shape ?
        if (SelectionRectangleGeometry.FillContainsWithDetail(Geometry.Parse(curveItem.Data)) == IntersectionDetail.Intersects)
            return true;
    }
}).ToList();

但它不起作用,测试总是返回相同的东西:相交。

我认为测试并没有考虑每个形状的位置(比如它是绝对的,而不是相对的)。

你知道我怎么做测试吗?

4

1 回答 1

4

您也许可以通过在可视层中进行几何命中测试来解决此问题。将您的 Canvas 和选择 Geometry 传递给如下所示的方法,该方法返回几何体命中的所有形状的列表。

private IList<Shape> GetSelectedShapes(UIElement element, Geometry geometry)
{
    var shapes = new List<Shape>();

    VisualTreeHelper.HitTest(element, null,
        result =>
        {
            var shape = result.VisualHit as Shape;

            if (shape != null)
            {
                shapes.Add(shape);
            }

            return HitTestResultBehavior.Continue;
        },
        new GeometryHitTestParameters(geometry));

    return shapes;
}

您可以开始阅读有关可视层中的命中测试的内容。

于 2013-05-31T15:52:02.360 回答