为什么对于两个不相交的矩形,Rect. intersect返回一个非空的Rect ?
本文关键字:Rect 一个 返回 intersect 为什么 于两个 | 更新日期: 2023-09-27 18:02:42
我在WPF中有一个小项目,我需要在其中交换ui元素。类似于谷歌的功能。
由于我不能发图片(没有足够的声誉),我将用文字解释。我有一个3x3的网格,定义如下:
0 1 2
0 C e C
1 e e e
2 L e C
其中C = canvas, L = label, e =空单元格(列+行)。
在MouseMove事件中,我正在跟踪我当前选择的画布,并通过网格中可用的所有其他画布的列表来检查它们是否重叠。问题来了;即使我将画布从(0,0)向右移动1个像素,它也会检测到它与画布从(2,2)相交。
我使用Rect. intersect (r1, r2)来确定相交区域,它应该返回一个空矩形,因为r1不重叠r2,但它总是返回一个非空矩形。
// Create the rectangle with the moving element width and height
Size draggedElementSize = new Size(this.DraggedElement.ActualWidth, this.DraggedElement.ActualHeight);
Rect draggedElementRect = new Rect(draggedElementSize);
foreach (Canvas c in canvases)
{
// Create a rectangle for each canvas
Size s = new Size(c.ActualWidth, c.ActualHeight);
Rect r = new Rect(s);
// Get the intersected area
Rect currentIntersection = Rect.Intersect(r, draggedElementRect);
if (currentIntersection == Rect.Empty) // this is never true
return;
} // end-foreach
我在循环中做了各种其他的事情,但是它们不以任何方式与这个交互,因为这个不能正常工作。
我很感激任何帮助。
谢谢。
在您的代码示例中没有任何地方可以通过位置来抵消rects。你只是在设置矩形的大小。
当然,所有的矩形都从点(0,0)开始,因此所有的矩形都相交。
您需要将您要检查的元素的rects转换为它们的父元素。
完成此任务的最快方法是VisualTreeHelper。GetOffset
// Create the rectangle with the moving element width and height
Size draggedElementSize = new Size(this.DraggedElement.ActualWidth, this.DraggedElement.ActualHeight);
Rect draggedElementRect = new Rect(draggedElementSize);
draggedElementRect.offset(VisualTreeHelper.GetOffset(this.DraggedElement));
foreach (Canvas c in canvases)
{
if (this.DraggedElement == c) continue; // skip dragged element.
// Create a rectangle for each canvas
Size s = new Size(c.ActualWidth, c.ActualHeight);
Rect r = new Rect(s);
r.offset(VisualTreeHelper.GetOffset(c));
// Get the intersected area
Rect currentIntersection = Rect.Intersect(r, draggedElementRect);
if (currentIntersection == Rect.Empty) // this is never true
return;
} // end-foreach
您可能希望确保跳过当前拖动的元素,如所示。
我没有看到任何引用的位置在你的代码,只有宽度和高度。你真的想让所有的矩形都从0/0开始吗?最有可能的是,它们都重叠。您需要包含x/y坐标