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

时间:2013-03-07 16:21:58

标签: c# .net wpf visual-studio geometry

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

由于我无法发布图片(信誉不足),我将在文中解释。我有一个像这样定义的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)来确定相交的区域,它应该返回一个空的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

我在循环中做了其他各种事情,但它们没有以任何方式与之交互,因为这不能正常工作。

我会感激任何帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

我没有看到代码中任何位置的引用,只有宽度和高度。你真的想在0/0开始你所有的矩形吗?最有可能的是,它们都会重叠。您需要包含x / y坐标。

答案 1 :(得分:1)

您的代码示例中没有任何地方按位置偏移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

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