2012-01-04 79 views
8

我有一個畫有2個「點」的畫布。看到這個(簡化)代碼:綁定到WPF Canvas上元素的Y座標

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

正如你所看到的,我想旋轉使用給定的RotateTransform畫布。

接下來,我想把一個TextBlock放在每個Ellipse(一個標籤)附近。但是,我不想將此TextBlock包含到畫布中,因爲它隨後也會旋轉。我希望文本保持水平。

任何想法如何以優雅的方式解決這個問題?

回答

3

這樣的事情,應該Canvas的變換矩陣你

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

分配到文本框中transformation matrix工作。

+0

這基本上是我所做的。 – mydogisbox 2012-01-04 15:34:48

0

好問題!而且我會猜測,所以請用一點鹽來回答這個問題。

我相信你正試圖將文字註釋放在旋轉畫布上的橢圓旁邊,但這些註釋需要保持水平。有兩兩件事你可以嘗試:

  • 首先,因爲你知道,從Canvas.GetTop/GetLeft每個橢圓的XY點,你可以通過應用RotateTransform到橢圓的位置找到了新的旋轉XY位置,使用公式U = M * V,其中U是輸出點,V是輸入點(橢圓的XY位置),M是旋轉矩陣。其次,您可以在第一個畫布上放置第二個畫布(假設它們都在網格中,第二個畫布的Z-index較高並且與底層畫布的大小相同)。稱它爲註釋層。您的註釋(文本標籤)可以顯示在新的轉換位置,並使用此方法不旋轉。

你不得不爲此在課程代碼,而不是XAML中,雖然你可能通過上創建TextBlock的值轉換器是綁定到源RotateTransform /橢圓找到一個結合友好的方式,做了這個操作適合你。

另一種方法是取反轉RotateTransform並將其應用於文本塊,但是您可能仍然需要翻譯才能到達新位置。無論哪種方式,我認爲這需要一些實驗。

最好的問候,