c# – 旋转后更改WPF元素的父级(设置新坐标问题)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 旋转后更改WPF元素的父级(设置新坐标问题),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3401字,纯文字阅读大概需要5分钟。
内容图文
![c# – 旋转后更改WPF元素的父级(设置新坐标问题)](/upload/InfoBanner/zyjiaocheng/819/4dcb88f0d6c94a62a5a46a35fb5abb47.jpg)
我需要更改元素的父级. (对于组/ ungroup形状)
但是如果一个元素有一个旋转,我就不能设置它的新位置.
我看过this,this,this和this页以及其他许多方法,但都没有正常工作.
请参阅my sample project和以下图片:
Rect1的父级是ChildCanvas1,Rect2的父级是ChildCanvas2,我想将Rect1和Rect2移动到MainCanvas. (并删除ChildCanvas和ChildCanvas2)
我对Rect1没有任何问题,因为它没有任何旋转.
但是Rect2有一个旋转(-20度),我无法正确设置它的新坐标.
请看这个图像:
如何在旋转后更改元素的父级并正确设置新坐标?
更新:
注意我需要一种通用的方法(对于大应用程序中的group / ungroup元素,每个元素(可能)都有TranslateTransform和SkewTransform以及RotateTransform和ScaleTransform)
XAML:
<Canvas x:Name="MainCanvas">
<Canvas x:Name="ChildCanvas1" Width="500" Height="250" Background="Bisque" Canvas.Top="54">
<Rectangle x:Name="Rect1" Width="200" Height="100" Fill="Red" Canvas.Left="150" Canvas.Top="100"/>
</Canvas>
<Canvas Name="ChildCanvas2" Width="500" Height="250" Background="Bisque" Canvas.Left="516" Canvas.Top="54">
<Rectangle Name="Rect2" Width="200" Height="100" Fill="Red" Canvas.Left="150" Canvas.Top="100">
<Rectangle.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="-40"/>
<RotateTransform Angle="-20"/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
<Button Name="btn1" Click="btn1_Click" Content="Move Rect1 to MainCanvas and Remove ChildCanvas1" Width="356" Height="30" Canvas.Left="59" Canvas.Top="310"/>
<Button Name="btn2" Click="btn2_Click" Content="Move Rect2 to MainCanvas and Remove ChildCanvas2" Width="350" Height="30" Canvas.Left="590" Canvas.Top="310"/>
C#代码:
GeneralTransform transform = Rect2.TransformToVisual(MainCanvas);
Rect rect = transform.TransformBounds(new Rect(0, 0, Rect2.Width, Rect2.Height));
double ChildCanvas2Left = Canvas.GetLeft(ChildCanvas2);
double ChildCanvas2Top = Canvas.GetLeft(ChildCanvas2);
ChildCanvas2.Children.Remove(Rect2);
MainCanvas.Children.Add(Rect2);
Canvas.SetLeft(Rect2, rect.Left);
Canvas.SetTop(Rect2, rect.Top);
MainCanvas.Children.Remove(ChildCanvas2);
解决方法:
将Rect2移动到MainCanvas后,需要重新计算Rect2.像这样:
Canvas.SetTop(Rect2, Canvas.GetTop(Rect2) + Canvas.GetTop(ChildCanvas2));
完整的代码:
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,如果没有它们,您可以更清洁,更轻松地获得相同的结果.像这样:
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);
内容总结
以上是互联网集市为您收集整理的c# – 旋转后更改WPF元素的父级(设置新坐标问题)全部内容,希望文章能够帮你解决c# – 旋转后更改WPF元素的父级(设置新坐标问题)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。