绑定WPF画布上元素的X、Y坐标

8

我有一个画布上绘制了两个“点”。请看这段(简化的)代码:

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

如您所见,我想使用给定的RotateTransform旋转画布。
接下来,我想在每个椭圆旁边放置一个TextBlock(标签)。但是,我不想将此TextBlock包含在Canvas中,因为它也会随之旋转。我希望文本保持水平。
有什么优雅的方法解决这个问题吗?
2个回答

3

像这样,应该适合你的需求。

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

将文本框的变换矩阵分配为Canvas的变换矩阵的逆矩阵


0

好问题!我猜测一下,所以请抱着半信半疑的态度接受这个答案。

我认为你正在尝试在旋转的画布上放置文本注释,但这些注释需要保持水平,并且要位于省略号旁边。你可以尝试以下两个方法:

  • 首先,给定每个椭圆的XY点(从Canvas.GetTop/GetLeft得到),您可以通过将RotateTransform应用于椭圆位置并使用公式U=M*V来查找其新旋转的XY位置,其中U是输出点,V是输入点(椭圆的XY位置),M是旋转矩阵。

  • 其次,您可以在第一个画布上放置第二个画布(假设它们都在网格中,第二个画布在更高的Z-index上,并且与底层画布的大小相同)。称之为注释层。使用此方法,您的注释(文本标签)可以出现在新的转换位置上,并且未经旋转。

当然,您必须在代码中执行此操作,而不是Xaml,尽管您可能会发现绑定友好的方法,即在TextBlock上创建一个值转换器,该值转换器绑定到源RotateTransform/Ellipse并为您执行此操作。

另一种方法是使用.RotateTransform的.Inverse,并将其应用于文本块,但是您可能仍然需要进行翻译以到达新位置。无论哪种方式,我认为都需要进行一些实验。

最好的问候,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接