假设我有一个想要在可视化设计器中旋转和缩放的元素: 用户应该能够拖动边缘,图形应该适当缩放 旋转以度数输入。
以下事实是旋转元素的问题:
当拖动左上角时,不仅宽度和高度会改变,而且左上角位置也会改变。
拖动右上角后,尺寸也会改变,Y位置也会改变
如果元素旋转(WPF RenderTransform,围绕它的中心旋转),那么行为必须相应地改变,我不知道如何。假设元素旋转90°,则之前左上角的点是右上角的点
这意味着我必须转变一些东西,但我完全被难倒了,我害怕了
我正在寻找在任何图形程序中实现的行为。
用户基本上拖动边界框的点,图形应该投射到框内。
如何在WPF中解决这个问题?
绘制的元素派生自UIElement,因此我可以访问所需的所有变换属性。该解决方案适用于输入的任何旋转。
如果你能帮助我,或者指出我正确的方向,我将不胜感激。
修改
我知道如何缩放和旋转元素。期望的结果是元素完全适合用户拖动的框。所以这个问题比WPF相关的数学更多。
修改
感谢downvoting而没有向我提出我可以改进的建议
为了解问题,请尝试以下方法:
创建一个新的WPF项目,添加ANY UIElement并旋转它,例如90°
现在记住拖动之前的边距,并将右下角拖动到某处。如您所见,保证金(=位置)也会发生变化。我的问题是如何计算这种补偿,以便在拖动时为用户提供所需的结果。因为如果我不改变位置以补偿比例,那么结果只是奇怪而且不符合预期。
补偿取决于元素的规模。明显。
请参考下图:
你在这里看到的是我拖动右下角之前的Canvas.Top和Canvas.Left属性,以及在我拖动右下角之后的下方。
http://imageshack.us/photo/my-images/268/beforeaftert.png/?sa=0
答案 0 :(得分:1)
您应该使用TransformGroup。
在TransformGroup中,您可以同时拥有ScaleTransform,RotateTransform,TranslateTransform和SkewTransform(按此顺序,这很重要)。
这样您就可以将每个动作映射到不同的变换。
您实际上不需要考虑不同的点,您只需要将鼠标移动映射到不同的变换。例如:
如果单击其中一个角,则每次移动鼠标都会触发ScaleTransform的更改。 如果单击旋转点,则可以在RotateTransform中触发更改。
如果您需要围绕中心的不同点进行缩放,倾斜或旋转,则需要对当前正在执行的变换进行补偿变换:
答案 1 :(得分:1)
也许看看http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part-1 调整大小部分涵盖了这些问题。基本的想法是识别你点击调整大小的元素(左角,右角等)然后有'数学'的东西来设置你的画布的左边和顶部。