Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到WPF画布上元素的X Y坐标_C#_.net_Wpf_Xaml - Fatal编程技术网

C# 绑定到WPF画布上元素的X Y坐标

C# 绑定到WPF画布上元素的X Y坐标,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有一张画有两个“点”的画布。请参阅此(简化)代码: 如您所见,我想使用给定的RotateTransform旋转画布 接下来,我想在每个椭圆(标签)附近放置一个文本块。但是,我不想将这个文本块包含到画布中,因为它随后也会旋转。我希望文本保持水平 你知道如何优雅地解决这个问题吗?好问题!我会猜,所以请对这个答案稍加保留 我相信您正在尝试将文本批注放置在旋转画布上的椭圆旁边,但这些批注需要保持水平。你可以尝试两件事: 首先,给定Canvas.GetTop/GetLeft中每个椭圆的XY点,您可

我有一张画有两个“点”的画布。请参阅此(简化)代码:


如您所见,我想使用给定的RotateTransform旋转画布

接下来,我想在每个椭圆(标签)附近放置一个文本块。但是,我不想将这个文本块包含到画布中,因为它随后也会旋转。我希望文本保持水平


你知道如何优雅地解决这个问题吗?

好问题!我会猜,所以请对这个答案稍加保留

我相信您正在尝试将文本批注放置在旋转画布上的椭圆旁边,但这些批注需要保持水平。你可以尝试两件事:

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

  • 其次,您可以在第一个画布上放置第二个画布(假设它们都在网格中,第二个画布的Z索引较高,并且与基础画布的大小相同)。称之为注释层。您的注释(文本标签)可以显示在新转换的位置,并使用此方法取消旋转

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

另一种方法是采用旋转变换的.Inverse,并将其应用于文本块,但是您可能仍然需要进行转换才能到达新位置。无论如何,我认为这需要一些实验

最好的祝愿,像这样的东西,应该适合你

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

为文本框
转换矩阵
指定
画布
转换矩阵的

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