2011-02-22 5 views
5

내 문제의 단순화 된 버전에 대해 레이아웃 회전 (심지어 렌더 변환 된) 모양의 경계 상자를 계산하여 원형 주위에 사각형을 완벽하게 맞출 수 있습니다. 또는 규모가있을 수 있습니다. 당신이 이것을 해결할 수 있다면, 나는 행복 할 것이다.WPF 요소의 실제 시각적 경계 상자 가져 오기?

더 복잡한 문제는 모든 프레임 워크 요소의 시각적 경계 상자를 계산하는 것입니다. '시각적 경계 상자'는 프레임 워크 요소 내에서 가장 많이 보이는 픽셀이 최상위 경계를 결정하고 가장 오른쪽 픽셀이 오른쪽 경계를 결정한다는 것을 의미합니다. 해결할 수 있다면 더 행복해집니다. .

LayoutInformation.GetLayoutSlot()으로 재생 해봤지만 예상대로 작동하지 않았습니다. '레이아웃 슬롯'은 실제로 실제 경계보다 훨씬 큽니다. 또한 VisualTreeHelper.GetDescendantBounds()를 사용하여 시도했지만, VisualParent를 사용하여 보호 된 내 테스트 모양 때문에이 속성에 액세스 할 수 없어서 여기에 들어가기 전에이를 확인하기로 결정했습니다.

WPF에서 요소의 실제 시각적 경계 상자를 쉽게 얻을 수있는 방법을 제공하기를 바랍니다. 모든 변환 후에 계산됩니다. 내 질문에 명확하지 않은 부분이 있으면 알려 주시기 바랍니다.

답변

4

VisualTreeHelper.GetDescendantBounds()으로 좋은 결과를 얻을 수 있으며 VisualTreeHelper.GetParent()을 사용하면 보호 된 VisualParent 속성에 액세스 할 수 있습니다. 그러나 당신이하고 싶은 것은 GetDescendantBounds을 형태 자체 (부모가 아닌)에 호출하는 것입니다. 왜냐하면 그 이름에도 불구하고이 메소드는 부모와 그 모든 후손의 경계를 반환하기 때문입니다.

+0

내 셰이프에서'GetDescendantBounds()'를 할 때 셰이프의 변형이 있더라도 변환되지 않은 원래 셰이프의 경계 인 사각형을 반환합니다. 'GetParent()'를 사용하여 셰이프의 부모를 얻은 다음 해당 부모를 통해 Visual에 캐스팅하고 해당 Visual을 GetDescendantBounds()에 전달하면 내 셰이프보다 훨씬 큰 사각형이 반환됩니다. – Dalal

8
private Rect GetRectOfObject(FrameworkElement _element) 
{ 
    Rect rectangleBounds = new Rect(); 
    rectangleBounds = _element.RenderTransform.TransformBounds(new Rect(0, 0, _element.Width, _element.Height)); 
    return rectangleBounds; 
} 

아마도 도움이 될 것입니다.

+8

'new Rect (0, 0, _element.Width, _element.Height)'는'new Rect (_element.RenderSize)'로 단순화 될 수 있습니다. – nmclean

0

컨트롤이 경계 밖으로 벗어날 수 있으므로 문제가 쉽지 않습니다. 그러나 이것이 발생하지 않는다고 가정하면 parent.TranslatePoint (point_in_child_coord_system, child)를 사용하여 (0,0) (child.ActualWidth, 0) (child.ActualWidth, child.ActualHeight) 및 (0)을 변환하여 문제를 해결할 수 있습니다. , child.ActualHeight)를 부모 좌표계에 연결합니다. 그런 다음 모든 점의 x 및 y 좌표를 정렬하고 최소 및 최대 값을 사용하여 경계 상자를 찾습니다. 참고 : 자식 회전이 가능하기 때문에 정렬이 필요합니다.

관련 문제