我在
WPF有一个小项目,我需要交换UIElements.类似于iGoogle功能的东西.
由于我无法发布图片(信誉不足),我将在文中解释.我有一个像这样定义的3×3网格:
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
我在循环中做了各种其他的事情,但它们没有以任何方式与此交互,因为这不能正常工作.
我会感激任何帮助.
谢谢.
最佳答案 您的代码示例中没有任何地方按位置偏移rects.您只需设置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
您可能需要确保跳过当前拖动的元素,如图所示.