2011-01-21 3 views
4

내가이 XAML 코드가 말할 수 있습니다 경우으로 RenderTransform을 무시 :WPF : 부모 내의 자식 UIElement의 위치를 ​​가져옵니다. 어떤

<DockPanel Name="pan"> 
    <Label Content="AAA" Name="lab1" /> 
    <Label Content="BBB" Name="lab2" /> 
    <Label Content="CCC" Name="lab3" /> 
</DockPanel> 

내 코드 내가 lab2의 좌표가 pan 내에서 무엇인지 찾으려 뒤에. Hovewerlab2의 현재 RenderTransform을 무시하고 싶습니다. 이 솔루션은 동일한 좌표 위의 코드 및 다음 반환해야합니다 그래서 : 다른 말로

<DockPanel> 
    <Label Content="AAA" /> 
    <Label Content="BBB" > 
     <Label.RenderTransform> 
      <TranslateTransform Y="20"/> 
     </Label.RenderTransform> 
    </Label> 
    <Label Content="CCC" /> 
</DockPanel> 

을 나는 but2Arrange를 호출 할 때 panArrangeOverride 방법으로 설정 한 위치를 원한다. 나는 그것을 논리적 위치라고 부를 것이다.

private Point visualPoss() { 
    Point lab2Vis = lab2.PointToScreen(new Point(0, 0)); 
    Point panVis = pan.PointToScreen(new Point(0, 0)); 
    return new Point(lab2Vis.X - panVis.X, lab2Vis.Y - panVis.Y); 
} 

그러나이 visualPoss()의 반환 값으로서 내 문제의 해결되지 않고, 모두 XAML 코드 예는 동일하지 않은 경우 : '시각 위치 "다음 메소드를 호출함으로써 얻을 수있다.

어싱이 명확하지 않은 경우 의견을 남기십시오.

답변

3

나는 변환을 얻을하고 MatrixTransform로 변환 것 감사드립니다. 그런 다음 Inverse 속성을 사용하여 렌더링 변환을 되돌릴 수 있습니다. 그것은과 같이 보일 것이다 : 매우 간단하고 명확한 해결책이 마치

private Point visualPoss() 
{ 
    Point lab2Vis = lab2.PointToScreen(new Point(0, 0)); 
    Point panVis = pan.PointToScreen(new Point(0, 0)); 

    if (lab2.RenderTransform != null) 
    { 
     var matrix = new MatrixTransform(lab2.RenderTransform.Value); 
     lab2Vis = matrix.Inverse.Transform(lab2Vis); 
    } 

    return new Point(lab2Vis.X - panVis.X, lab2Vis.Y - panVis.Y); 
} 
+0

하나의 비틀기 ... 비주얼 트리를 최대한 멀리 걸어서 각 렌더링 트렌스 폼의 역함을 적용하고 싶을 것입니다. –

+0

일반적인 방법에 대한 좋은 지적입니다. 이 요소는 비교에 관심이있는 패널의 하위 요소이므로이 경우 필자는 필요하다고 생각하지 않았습니다. –

+0

당신을 dissapoint 유감스럽게 생각합니다. 그러나 이것과 매우 비슷한 것을 tryied했습니다. 그리고 그것은 효과가 없었습니다 - 유일한 차이점은 다음과 같이 원본으로부터 역변환을 만들었습니다 : lab2.RenderTransform.Inverse.Transform (lab2Vis) '. 이유는 모르겠지만 좌표를 다시 원래 위치로 변환하지 않았습니다. – drasto

6

: 그것은 잘 작동처럼

private Point logicalPoss() { 
    Vector vec = VisualTreeHelper.GetOffset(lab2); 
    return new Point(vec.X, vec.Y); 
} 

것 같습니다. 만약 그것이 작동하지 않을 때 당신이 scenerio을 아는 것이라면 코멘트를 남겨주세요.

+1

감사합니다. 절대적으로 반 직관적 인 메서드 이름이지만 매력처럼 작동합니다. – greenoldman

관련 문제