我在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
我在循环中做了其他各种事情,但它们没有以任何方式与之交互,因为这不能正常工作。
我会感激任何帮助。
感谢。
答案 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
您可能需要确保跳过当前拖动的元素,如图所示。