C# 旋转后更改WPF元素的父元素(设置新坐标)

C# 旋转后更改WPF元素的父元素(设置新坐标),c#,wpf,xaml,rotation,position,C#,Wpf,Xaml,Rotation,Position,我需要更改元素的父元素。(用于编组/取消编组形状) 但是如果元素有旋转,我不能为它设置新的位置 我看到了,页面和许多其他方式,但没有一种工作正常 请参见和下图: Rect1的父对象是ChildCanvas1,Rect2的父对象是ChildCanvas2,我想将Rect1和Rect2移动到maincavas。(并删除ChildCanvas和ChildCanvas2) 我对Rect1没有任何问题,因为它没有任何旋转。 但是Rect2有一个旋转(-20度),我无法正确设置它的新坐标 请看这张图片:

我需要更改元素的父元素。(用于编组/取消编组形状) 但是如果元素有旋转,我不能为它设置新的位置

我看到了,页面和许多其他方式,但没有一种工作正常

请参见和下图:

Rect1
的父对象是
ChildCanvas1
Rect2
的父对象是
ChildCanvas2
,我想将
Rect1
Rect2
移动到
maincavas
。(并删除
ChildCanvas
ChildCanvas2

我对
Rect1
没有任何问题,因为它没有任何旋转。 但是
Rect2
有一个旋转(-20度),我无法正确设置它的新坐标

请看这张图片:

如何在旋转后更改元素的父元素并正确设置新坐标

更新:

注:我需要一种通用方法(对于大型应用程序中的组/解组元素,每个元素(可能)都有
TranslateTransform
SkewTransform
RotateTransform
ScaleTransform

XAML:


我已将
Rect2的
RenderTransform
更改为
layoututtransform

<Rectangle Name="Rect2" Width="200" Height="100" Fill="Red" Canvas.Left="150" Canvas.Top="100">
       <Rectangle.LayoutTransform>
           <RotateTransform Angle="-20"/>
       </Rectangle.LayoutTransform>
</Rectangle>

现在
Rect2
如下所示:

当我按下第二个按钮时,我看到以下结果:


因此,
Rect2
保持在原始位置。

Rect2
移动到
MainCanvas
后,需要重新计算
Rect2
。像这样:

Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
ChildCanvas2.Children.Remove(Rect2);
MainCanvas.Children.Remove(ChildCanvas2);
Canvas.SetLeft(Rect2, Canvas.GetLeft(Rect2) + Canvas.GetLeft(ChildCanvas2));
Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
MainCanvas.Children.Add(Rect2); 
完整代码:

private void btn2_Click(object sender, RoutedEventArgs e)
{       
    GeneralTransform transform = Rect2.TransformToVisual(MainCanvas);
    Rect rect = transform.TransformBounds(new Rect(0, 0, Rect2.Width, Rect2.Height));
    ChildCanvas2.Children.Remove(Rect2);
    MainCanvas.Children.Remove(ChildCanvas2);
    Canvas.SetLeft(Rect2, rect.Left);
    Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
    MainCanvas.Children.Add(Rect2);      
}
但是,在您的情况下,
Rect2.TransformToVisual
transform.TransformBounds
是不必要的,您可以在没有它们的情况下更清晰、更容易地执行,并获得相同的结果。像这样:

Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
ChildCanvas2.Children.Remove(Rect2);
MainCanvas.Children.Remove(ChildCanvas2);
Canvas.SetLeft(Rect2, Canvas.GetLeft(Rect2) + Canvas.GetLeft(ChildCanvas2));
Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
MainCanvas.Children.Add(Rect2); 
编辑:一般方法:

ChildCanvas2.Children.Remove(Rect2);
MainCanvas.Children.Remove(ChildCanvas2);
Canvas.SetLeft(Rect2, Canvas.GetLeft(Rect2) + Canvas.GetLeft(ChildCanvas2));
Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
Canvas.SetRight(Rect2, Canvas.GetRight(Rect2) + Canvas.GetRight(ChildCanvas2));
Canvas.SetBottom(Rect2, Canvas.GetBottom(Rect2) + Canvas.GetBottom(ChildCanvas2));
MainCanvas.Children.Add(Rect2);  

谢谢你的回复,但我需要使用RenderTransform(不是LayoutTransform)来完成。你能显示你的XAML代码吗?@S.Akbari,请下载我的示例项目。好的。检查我的答案。另外,请更新您的问题,并将XAML和c#代码发布到您的项目中,而不是附加到项目中,以便将来的访问者可以复制。@S.Akbari,好的,谢谢。