在Canvas中旋转控件RenderTransform后 在获取坐标没有变化Convert.ToInt32(Canvas.GetLeft(rect))bug?

vc815 2012-08-10 11:45:06
rect.RenderTransform = new RotateTransform() { Angle=90};

X = Convert.ToInt32(Canvas.GetLeft(rect));
上面这个X值没有变化

界面上 控件的确旋转 位置也变量 可以获取的X 坐标还是原来的坐标
这是怎么回事?
有人知道吗
谢谢!
...全文
339 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zealot112345 2012-09-05
  • 打赏
  • 举报
回复
不好意思。打错了 是rect.RenderTransform.transform(new Point(x,y))
zealot112345 2012-09-05
  • 打赏
  • 举报
回复
不好意思。打错了 是rect.RenderTransform.transform(new Point(x,y))
vc815 2012-09-05
  • 打赏
  • 举报
回复
rect.transform(new Point(x,y)) 没有这个函数啊
vc815 2012-09-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用楼主 的回复:
rect.RenderTransform = new RotateTransform() { Angle=90};

X = Convert.ToInt32(Canvas.GetLeft(rect));
上面这个X值没有变化

界面上 控件的确旋转 位置也变量 可以获取的X 坐标还是原来的坐标
这是怎么回事?
有人知道吗
谢谢!

先调用canvas.ge……
[/Quote]


rect.transform(new Point(x,y))

没有这个transform 函数 啊!!!
zealot112345 2012-09-03
  • 打赏
  • 举报
回复
你取得的坐标没有变化是因为它实际上是多渲染了一个surface,并没有在原来控件上发生改变。而你所看到的旋转只是新的surface发生的变化。
这个和在sl中要尽量减少使用opacity属性是同一个道理。它也是因为渲染这个属性的时候sl会多生成一个surface。增加渲染过程。加大程序负担。
zealot112345 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
rect.RenderTransform = new RotateTransform() { Angle=90};

X = Convert.ToInt32(Canvas.GetLeft(rect));
上面这个X值没有变化

界面上 控件的确旋转 位置也变量 可以获取的X 坐标还是原来的坐标
这是怎么回事?
有人知道吗
谢谢!
[/Quote]
先调用canvas.getleft和canvas.gettop获取到现在坐标x,y。然后用rect.transform(new Point(x,y))就可以得到变换后的坐标了。
vc815 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
如果你要让一个 RotateTransform 会去永久地改变宿主的坐标,你完全曲解了整个这类机制的设计理念。如果它永久地改变了宿主的坐标,那么新的坐标再加上 RotateTransform,结果是什么?是不是无限递归了?
[/Quote]

但是!
如果获取到旋转的位置的 新坐标
谢谢
  • 打赏
  • 举报
回复
如果你要让一个 RotateTransform 会去永久地改变宿主的坐标,你完全曲解了整个这类机制的设计理念。如果它永久地改变了宿主的坐标,那么新的坐标再加上 RotateTransform,结果是什么?是不是无限递归了?
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
这么说就比较奇怪了!
从界面上看 控件的位置已经发生变化 获取坐标的方法 Convert.ToInt32(Canvas.GetLeft(rect));
应该就这一种??

代码的逻辑 和实际显示的现象对不上啊!
微软是怎么想的???怎么能这么设计???
[/Quote]

是你没有搞懂“坐标”的意思。坐标就是指控件的本身。打个比方,一个宇宙飞船放出了一个机械臂在那里荡来荡去地抓东西,你说宇宙飞船的坐标跟机械手的坐标是一回事吗?
vc815 2012-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
旋转的情况下其坐标是并没有变化的,这种情况下还是以原坐标为基准点,然后按照矩阵变换运算得到坐标点的。在这里如果你需要得到最新的坐标点位置可以通过以下文章中的矩阵公式得到:
http://www.cnblogs.com/chengxingliang/archive/2011/08/16/2137800.html
[/Quote]

你发的网址看了
但是说的是MatrixTransform
我用的是RotateTransform 这个网址没说RotateTransform继承自MatrixTransform 或者说他们用的同一个原来啊!!
所以是不是你理解错了!!!
我感觉 MatrixTransform RotateTransform 应该是两种实现方式!要不 这个网址怎么会有
“MatrixTransform实现RotateTransform效果” 这样的话!!!
vc815 2012-08-11
  • 打赏
  • 举报
回复
这么说就比较奇怪了!
从界面上看 控件的位置已经发生变化 获取坐标的方法 Convert.ToInt32(Canvas.GetLeft(rect));
应该就这一种??

代码的逻辑 和实际显示的现象对不上啊!
微软是怎么想的???怎么能这么设计???
Architecture Net 2012-08-10
  • 打赏
  • 举报
回复
旋转的情况下其坐标是并没有变化的,这种情况下还是以原坐标为基准点,然后按照矩阵变换运算得到坐标点的。在这里如果你需要得到最新的坐标点位置可以通过以下文章中的矩阵公式得到:
http://www.cnblogs.com/chengxingliang/archive/2011/08/16/2137800.html

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧