2012-10-04 23 views
0

我創建了一個可拖動的控件,想要限制它的包含網格的邊界(即不讓用戶將它拖到網格外)。Silverlight命中一個對象在一個Grid邊界內

我需要一個測試,返回true或false,以便我可以在必要時取消拖動。

我已經看過VisualTreeHelper.FindElementsInHostCoordinates和TransformToVisual等,但我找不到對控件的每個角落進行大量檢查的簡單方法。

例如一些代碼(Dialog是正在拖動控件的名稱):

MouseEventHandler mouseMove = (s, args) => 
     { 
      var transform = new TranslateTransform(); 
      transform.X = args.GetPosition(Dialog).X - _mouseDownPosition.X; 
      transform.Y = args.GetPosition(Dialog).Y - _mouseDownPosition.Y; 

      if (transformGroup != null) 
      { 
       transformGroup.Children.Add(transform); 
       Dialog.RenderTransform = transformGroup; 
      } 

     }; 

回答

0

感謝。最後,我採取了另一種方法;而不是試圖阻止用戶將任何子控件拖放到容器邊界之外,我只停止它們將指針拖到邊界之外,例如,在鼠標移動事件處理程序中:

if ((args.GetPosition(parentGrid).X < 0 || args.GetPosition(parentGrid).Y < 0)) 
{ 
    return; // don't do a translatetransform 
} 

問題在於,子控件的部件在容器外可見。

我所做的是設置父控件的Clip屬性,以便邊界外部的子部分被隱藏。

例如爲:

var clipRegion = new RectangleGeometry(); 
clipRegion.Rect = new Rect(0, 0, elementParent.ActualWidth, elementParent.ActualHeight); 
elementParent.SetValue(Canvas.ClipProperty, clipRegion); 

這似乎很好地工作!

0

這是沒有辦法比檢查控制的每個角落等。

然而,正如你知道Dialog,你可以採取一些快捷鍵你是什麼在拖它在拖動過程中,它是不可能的Dialog左側邊是權不會改變形狀或大小沒有Dialog的右邊緣的Grid的右邊緣也在Grid的右邊。這僅適用於Dialog未旋轉。

所以,你需要像下面的僞代碼:

if (Dialog.Left >= Grid.Left && 
    Dialog.Top >= Grid.Top && 
    Dialog.Right <= Grid.Right && 
    Dialog.Bottom <= Grid.Bottom) 
{ 
    // Allow the drag 
} 
else 
{ 
    // Snap Dialog to the edge of Grid 
}