首页 文章

WPF使用拖动矩形对形状进行多重选择

提问于
浏览
4

我想使用拖动矩形实现多个形状选择 . 我在画布上有很多形状:
enter image description here

Thoses形状绑定到相应的模型(MVVM) . 我的选择矩形看起来像这样:
enter image description here

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

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();

但它不起作用,测试总是同样的事情:相交 .

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

你知道我怎么做我的测试吗?

1 回答

  • 3

    您也许可以通过在可视层中执行geometry hit test来解决此问题 . 将Canvas和选择Geometry传递给如下所示的方法,该方法返回由几何体命中的所有Shapes的列表 .

    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;
    }
    

    你可以开始阅读Hit Testing in the Visual Layer .

相关问题