4

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

由于我无法发布图片(没有足够的声誉),我将在文字中解释。我有一个像这样定义的 3x3 网格:

   0   1   2
 0 C   e   C
 1 e   e   e
 2 L   e   C

其中 C = 画布,L = 标签,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

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

我将不胜感激任何帮助。

谢谢。

4

2 回答 2

1

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

于 2013-03-07T16:31:57.607 回答
1

在您的代码示例中,您没有按位置偏移矩形。您只是设置矩形大小。

因此,当然,您所有的矩形都从 Point(0,0) 开始,因此都相交。

您需要将矩形从您检查的元素转换为它们的父元素。

最快的方法是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

您可能希望确保跳过当前拖动的元素,如所示。

于 2013-03-07T16:32:01.123 回答