c# – 为什么Rect.Intersect为两个没有交叉的矩形返回一个非空的Rect?

我在
WPF有一个小项目,我需要交换UIElements.类似于iGoogle功能的东西.

由于我无法发布图片(信誉不足),我将在文中解释.我有一个像这样定义的3×3网格:

   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)来确定相交的区域,它应该返回一个空的Rect,因为r1不与r2重叠,而是总是返回一个非空的Rect.

        // 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.您只需设置rects大小.

所以当然,所有的rects都从Point(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

您可能需要确保跳过当前拖动的元素,如图所示.

点赞