2010-08-12 4 views
14

이 간단한 요청을 고려해 볼 수는 있지만 검색에 결정적인 답을 찾지 못하는 것 같습니다. 다른 부모 요소와 비교하여 내 윈도우에서 특정 시각적 요소의 경계를 어떻게 결정할 수 있습니까?일부 부모와 관련된 WPF 요소의 경계 사각형 확인

나는 LayoutInformation.GetLayoutSlot을 사용해 보았습니다. 그러나 이것은 단지 0,0에서 Rect을 반환하는 것으로 보이며 요소의 실제 위치를 반영하지 않습니다.

내가하려는 것은 RenderTargetBitmap을 사용하여 창의 "스크린 샷"을 가져 와서 특정 요소로 자르지 만, 비트 맵을자를 내용을 알기 위해 요소의 경계를 가져올 수 없습니다!

답변

15

그것은 매우 간단합니다 : 그것은 잔인한있을 수 있습니다 사실

public static Rect BoundsRelativeTo(this FrameworkElement element, 
             Visual relativeTo) 
{ 
    return 
    element.TransformToVisual(relativeTo) 
      .TransformBounds(LayoutInformation.GetLayoutSlot(element)); 
} 

는 별도의 방법에 넣어.

+3

'GetLayoutSlot'은 요소의 레이아웃에 할당 된 공간을 가져옵니다. 그러나 명시적인 폭/높이 및/또는 변형이 있으면 실제 요소 크기가 다를 수 있습니다. "true"크기의 rect를 얻으려면,'element.RenderTransform.TransformBounds (new Rect (element.RenderSize))'를 시도해보십시오. – nmclean

3

신경 끄시 고, 나는 마침내 및 UIElement.TranslatePoint() (아마 ActualWidth/ActualHeight 또는 RenderSize 중 하나를 사용할 수도 있지만) LayoutInformation.GetLayoutSlot()의 조합을 사용하여 그것을 알아낼 수 있었다. 잘

myElement.GetBounds(relativeElement); 

오 :

는이처럼 간단 할 수있는 다소 복잡한 솔루션을 보인다. 어쩌면 확장 메서드에 대한 시간. :)

+1

FrameworkElement에는 GetBounds 메서드가 없습니다. – ygoe

+1

나는 있어야한다고 말하고 있었다. – devios1

+1

완벽한 솔루션을 보여 주시겠습니까? 나는 그것이 작동하도록하지 않았다. 부모 요소에 비해 항상 잘못되었습니다. 지금은 모든 것을 WM_NCHITTEST를 처리 할 수있는 myElement.PointToScreen (new Point())와 함께 화면 좌표로 변환합니다. 하지만 여전히 해킹이라고 생각합니다. – ygoe

3

LayoutSlot 옵션이 전혀 작동하지 않았습니다.

public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent) 
    { 
     GeneralTransform gt = child.TransformToAncestor(parent); 
     return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight)); 
    } 
+0

이것은 나를 위해 일했으며, 받아 들여진 대답은 그렇지 않았습니다. .NET Framework 4.5.2에서 WPF로 그리드에서 테두리를 사용하여 작업하기. – pauldendulk

0

이 나를 위해 문제를 해결 계정으로 내가 여기 몇 가지 제안을 촬영 : 이 지정된 부모/조상 제어 나에게 아이의 위치를 ​​제공 끝났다.

item.TransformToVisual(relativeToElement) 
    .TransformBounds(new Rect(item.RenderSize)); 
관련 문제