2012-10-04 2 views
0

그리드가 포함 된 경계로 제한하려는 드래그 가능한 컨트롤을 만들었습니다 (즉, 사용자가 그리드 외부로 드래그하지 못하게 함).Silverlight가 Grid 경계 안에 있습니다.

필요한 경우 드래그를 취소 할 수 있도록 true 또는 false를 반환하는 테스트가 필요합니다.

VisualTreeHelper.FindElementsInHostCoordinates 및 TransformToVisual 등을 살펴 봤지만 컨트롤의 각 모서리마다 많은 검사를하지 않고도이를 수행하는 간단한 방법을 찾을 수 없습니다.

일부 코드 (대화 상자는 드래그되는 컨트롤의 이름 임) :

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

감사 :

그래서, 당신은 다음과 같은 의사 코드 같은 것을해야합니다. 결국 나는 또 다른 접근법을 취했다. 사용자가 컨테이너 경계 밖으로 자식 컨트롤을 드래그하는 것을 멈추려 고 시도하는 대신 경계 밖으로 포인터를 드래그하지 못하게했습니다. mouseMove 및 이벤트 핸들러에 :

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의 오른쪽에 오게되는 것은 불가능합니다. Grid의 우단은 의 오른 J 모서리가없고 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 
}