2

假设我有一个要在视觉设计器中旋转和缩放的元素:用户应该能够拖动边缘并且图形应该适当地缩放。
旋转以度数输入。



以下事实是旋转元素的一个问题:
当左上角被拖动时,不仅宽度和高度会改变,而且左上角的位置也会改变。当右上方的点被拖动时,大小和 Y 位置也会发生变化

但是如果元素旋转(WPF RenderTransform,围绕它的中心旋转),那么行为必须相应地改变,我不知道如何。假设元素旋转了 90°,那么之前在左上角的点就是右上角。
这意味着我必须改变一些东西,但我完全被难住了,恐怕

我正在寻找一种在任何图形程序中实现的行为。
用户基本上拖动边界框的点,图形应投影在框内。

这个问题如何在 WPF 中解决?
绘制的元素派生自 UIElement,因此我可以访问所需的所有转换属性。该解决方案应该适用于输入的任何旋转。
如果您能帮助我,或者指出我正确的方向,我将不胜感激。

编辑:
我知道如何缩放和旋转元素。期望的结果是元素完全适合用户拖动的框。所以这个问题比 WPF 更与数学相关。

编辑:
感谢您在没有提供我可以改进的建议的情况下投票。
为了理解问题,请尝试以下操作:
创建一个新的 WPF 项目,添加任何 UIElement 并将其旋转,例如 90°。
现在在拖动之前记住边距,然后将右下角拖动到某处。如您所见,边距(= 位置)也发生了变化。我的问题是如何计算此补偿以在拖动时为用户提供所需的结果。因为如果我改变位置来补偿比例,结果就会很奇怪并且不会像预期的那样表现。
补偿取决于元素的比例。明显地。
请参考下图:
您在这里看到的是在我拖动右下点之前的 Canvas.Top 和 Canvas.Left 属性,以及在我拖动右下点之后的下方。
http://imageshack.us/photo/my-images/268/beforeaftert.png/?sa=0

4

2 回答 2

1

您应该使用 TransformGroup。

在 TransformGroup 中,您可以同时拥有 ScaleTransform、RotateTransform、TranslateTransform 和 SkewTransform(按此顺序,这很重要)。

通过这种方式,您可以将每个操作映射到不同的转换。

您实际上不需要考虑不同的点,只需将鼠标移动映射到不同的变换。例如:

如果单击其中一个角,则每次鼠标移动都会触发 ScaleTransform 的变化。如果单击旋转点,则可以触发 RotateTransform 中的更改。

如果您需要围绕中心的不同点进行缩放、倾斜或旋转,您将需要对当前执行的那个进行补偿转换:

  • ScaleTransform 将需要 translateTransformation 来补偿由缩放引起的横向/垂直差异。
  • 当围绕不同的中心点旋转时,您只需更改旋转变换的 centerX / centerY
于 2013-04-18T19:16:50.757 回答
1

也许看看http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part-1 调整大小部分涵盖了这些问题。基本思想是识别您单击以调整大小的元素(左角,右角等)。然后有“数学”东西来设置画布的左和上。

于 2013-04-20T10:22:49.983 回答