2012-01-04 78 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并将其应用于文本块,但是您可能仍然需要翻译才能到达新位置。无论哪种方式,我认为这需要一些实验。

最好的问候,