2012-07-04 32 views
0

我剛剛完成了構建表格佈局面板中的一個UI的程序的一部分。這個工作到目前爲止,但我注意到,在我可以嘗試我的控制(我添加的功能)在運行周圍的窗體,但現在它在單元格中,他們不能移動到他們的容器單元格外。然而,這是偉大的,正是我所需要的,但我發現控件(例如一個按鈕)將被正確包含在左邊的單元格和單元格的頂部邊界,但底部和右邊界允許控制從它消失。下面有一些截圖來證明:表佈局面板單元格邊界和控制衝突

enter image description here

在這裏,我們看到,該按鈕控制不能移過電池的頂部和左側邊界。

enter image description here

但是在這裏似乎能夠移過電池的底部和右側邊界。

我是如何讓我的控制移動回想起來,我遇到了,我必須設置一些變量部分,如下圖所示:

public static void MouseMove(object sender, MouseEventArgs e) 
     { 
      Control control = sender as Control; 
      Control container = sender as Control; 
      if (control != null) 
      { 
       if (Dragging) 
       { 
        if (direction != Direction.Vertical) 
        { 
         container.Left = Math.Max(0, e.X + container.Left - DragStart.X); 
        } 
        if (direction != Direction.Horizontal) 
        { 
         container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y); 
        } 
       } 
      } 
     } 

我想在這裏我沒有設置底部和右容器的邊界,這將是有意義的,但是在探索智能感知,我似乎無法得到container.right和container.bottom爲他們提供了下列提示:

"gets the distance, in pixels, between the right edge of the control, and the left edge of it's container's client area" 

和底部不相同,僅用於控件的底部和容器區域的頂部。

有沒有在這附近?也許是一個將控制器底部連接到單元格底部邊界的選項,右邊是相同的?

編輯1:或者也許我需要改變我的mousemove事件以更好地處理碰撞,所以如果有人對此有任何想法,那就太棒了,以前我沒有真正看過太多的碰撞檢測,特別是在winforms中。

回答

1

Control.right是一個只讀屬性。嘗試設置

if (direction != Direction.Vertical) 
{ 
    container.Left = Math.Max(0, e.X + container.Left - DragStart.X); 
    container.Left = Math.Min(container.Left, container.Parent.Width - container.Width; 
} 
if (direction != Direction.Horizontal) 
{ 
    container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y); 
    container.Top = Math.Min(container.Top, container.Parent.Height - container.Height; 
} 
+0

嗯,沒有工作。我想我可能需要在這裏做碰撞檢測,也許與控制和它的容器的矩形/界限有關 –

+0

該按鈕是直接添加到TableLayouPanel,還是在另一個控件中? – AlexDev

+0

它在控制中。我像這樣訪問它.. DeviceManager.deviceManagerInstance.Controls [「tableLayoutPanel1」]。Controls [「panelMap」] –