2013-03-07 53 views
4

我在WPF中有一個小項目,在這個項目中我需要交換UIElements。類似iGoogle的功能。爲什麼Rect.Intersect爲兩個不相交的矩形返回一個非空Rect?

由於我無法發佈圖片(沒有足夠的聲望),我會在文本中解釋。我有這樣定義一個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 

我在做循環內的各種其他事情,但他們不以任何方式與此交互,因爲這不能正常工作。

我會很感激任何幫助。

謝謝。

+0

也許你可以使用[拖放](http://msdn.microsoft.com/en-us/library/ms742859.aspx)功能實現?那麼你不必自己打擊測試。如果有東西被拖放到你的控制器上,你可以交換控件。 – nvoigt 2013-03-07 16:39:17

+0

我不會將元素移動到我的畫布上。我將在網格上的不同位置移動畫布(包含多個元素)。但我會閱讀你給我的鏈接,也許它會幫助我,因爲我對WPF很陌生。 – Andrei 2013-03-07 16:51:48

回答

1

代碼示例中沒有任何地方是按位置偏移rects。你只是設置rects的大小。

所以當然,你所有的rects開始點(0,0),因此所有的rects都相交。

您需要將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

我認爲一旦我發佈了這個,我已經注意到了。現在我的問題是我無法獲得循環中畫布的座標以正確放置它。 – Andrei 2013-03-07 16:35:35

+0

我在進入循環之前從畫布列表中刪除當前拖動的元素。謝謝,Offset()方法取得了訣竅,儘管現在我在別處遇到了麻煩(現在矩形不再相交,即使重疊也不會相交)。也許我會在這裏更新評論或對第一個問題進行編輯。 – Andrei 2013-03-07 16:46:16

+0

檢查rects的大小。ActualHeight/ActualWidth是非常挑剔的,甚至可以在渲染對象後返回NaN。煩人。 – 2013-03-07 19:18:49

1

我沒有看到您的代碼中的位置的任何引用,只有寬度和高度。你真的想在0/0處開始你所有的矩形嗎?很可能,它們都會重疊。您需要包含x/y座標。

+0

就像我回復了第一條評論。 – Andrei 2013-03-07 16:35:55

相關問題