gpt4 book ai didi

c# - 为什么 Rect.Intersect 会为两个不相交的矩形返回一个非空的 Rect?

转载 作者:行者123 更新时间:2023-11-30 12:30:51 26 4
gpt4 key购买 nike

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

由于我发不了图片(信誉不够)我会用文字说明。我有一个这样定义的 3x3 网格:

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

其中 C = Canvas ,L = 标签,e = 空单元格(列+行)。

在 MouseMove 事件中,我跟踪我当前选择的 Canvas ,并浏览网格中所有其他可用 Canvas 的列表以检查它们是否重叠。问题来了;即使我将 Canvas 从 (0,0) 向右移动 1 个像素,它也会检测到它与来自 (2,2) 的 Canvas 相交。

我正在使用 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

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

我将不胜感激任何帮助。

谢谢。

最佳答案

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

当然,您所有的矩形都从 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

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

关于c# - 为什么 Rect.Intersect 会为两个不相交的矩形返回一个非空的 Rect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15276310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com