我想使用拖动矩形实现多个形状选择 . 我在画布上有很多形状:
Thoses形状绑定到相应的模型(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();
但它不起作用,测试总是同样的事情:相交 .
我认为测试并没有考虑每个形状的位置(如果它是绝对的,而不是相对的) .
你知道我怎么做我的测试吗?
1 回答
您也许可以通过在可视层中执行geometry hit test来解决此问题 . 将Canvas和选择Geometry传递给如下所示的方法,该方法返回由几何体命中的所有Shapes的列表 .
你可以开始阅读Hit Testing in the Visual Layer .