2012-01-04 3 views
8

캔버스에 2 개의 "점"이 그려져 있습니다. 이 (간체) 코드를 참조하십시오 : 당신이 볼 수 있듯이WPF 캔버스에서 요소의 X 좌표 Y로 바인딩

<Canvas> 
    <Ellipse /> 
    <Ellipse /> 
    <Canvas.RenderTransform> 
     <RotateTransform x:Name="rotateEllipse" /> 
    </Canvas.RenderTransform> 
</Canvas> 

, 나는 주어진 RotateTransform을 사용하여 캔버스를 회전합니다.

다음으로 각 타원 (레이블) 근처에 TextBlock을 배치하려고합니다. 그러나 Canvas에이 TextBlock을 포함 시키려하지 않기 때문에이 TextBlock도 회전합니다. 나는 텍스트를 수평으로 유지하기를 원한다.

우아한 아이디어로 어떻게 해결할 수 있습니까?

답변

3

뭔가, 해야 Canvas의 변환 행렬의 당신

<TextBlock RenderTransform="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, 
                 Path=RenderTransform.Inverse}"/> 

지정 텍스트 상자 transformation matrix에 역에 대한 작동합니다.

+0

이것은 기본적으로 내가 한 것입니다. – mydogisbox

0

좋은 질문! 그리고 저는 추측 할 것입니다. 그래서이 대답을 소금 한 덩어리로 가져 가십시오.

회전 된 캔버스에서 타원 옆에 텍스트 주석을 넣으려고한다고 생각하지만이 주석은 수평을 유지해야합니다. 당신이 시도 할 수있는 두 가지 : 당신이 Canvas.GetTop/메쏘드 getLeft 각 타원 알고있는 XY 포인트 부여, 사용, 타원의 위치에 RotateTransform을 적용하여 새로운 회전 XY 위치를 찾을 수

첫째
  • , 공식 U = M * V, 여기서 U는 출력 점, V는 입력 점 (타원의 XY 위치) 및 M은 회전 행렬입니다.

  • 둘째, 두 번째 캔버스를 첫 번째 캔버스 위로 놓을 수 있습니다 (두 번째 캔버스가 둘 다 Z- 인덱스보다 높고 기본 캔버스와 크기가 같다고 가정). 주석 레이어라고 부릅니다. 주석 (텍스트 레이블)은 새로운 변환 된 위치에 표시 될 수 있으며이 방법을 사용하여 회전되지 않습니다.

당신은 물론 코드에서이 작업을 수행해야 할 것,하지 XAML, 당신은 소스 RotateTransform/타원에 결합하는 TextBlock에 값 변환기를 작성하여 바인딩 친화적 인 접근 방식을 찾을 수도 있지만 및 한 당신을위한이 작전.

또 다른 방법은 RotateTransform의 .Inverse를 가져 와서 텍스트 블록에 적용하는 것입니다.하지만 새 위치로 이동하려면 번역해야 할 수도 있습니다. 어쨌든 나는 그것이 약간의 실험을 요구한다고 생각한다.

감사합니다,이 같은