为什么对于两个不相交的矩形,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

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

我很感激任何帮助。

谢谢。

为什么对于两个不相交的矩形,Rect. intersect返回一个非空的Rect ?

在您的代码示例中没有任何地方可以通过位置来抵消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坐标

相关文章: