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,好的,谢谢。