WPF缩放矩形并不保持比例

3
我遇到了一个小问题。我正在设计一款运行在Windows 8.1平板电脑上的WPF应用程序。我正在构建一种“裁剪”软件(以及其他功能)。
为此,我在我的窗口上创建了一个矩形,并按照Microsoft的步骤进行操作,链接如下: http://msdn.microsoft.com/en-us/library/vstudio/ee649090(v=vs.100).aspx 因为我不想保持我的矩形是正方形,所以我通过在ManipulationDelta上设置Scale.Y来改变它们的示例。
以下是更改后的代码:
rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X,
                    e.DeltaManipulation.Scale.Y,
                    e.ManipulationOrigin.X,
                    e.ManipulationOrigin.Y);

但是尽管如此,当我捏合调整大小时,我的矩形仍然会变成正方形。我不明白为什么或如何解决这个问题。
2个回答

1
WPF操作API不支持在旋转时独立缩放X和Y。请进行以下练习:画一个矩形并在其中放置两个点。现在将那个带有这两个点的矩形对角线移开,根据这些点之间的增量,您如何确定用户是尝试旋转还是独立缩放X或Y或同时进行?我们只有有限的信息,完全无法确定。因此,应用程序通常会具有特定的“手柄”,您需要触摸它们以明确进入“旋转”模式或“X / Y调整大小”模式。从实现的角度来看,您将处理该句柄(与控件本身分开)上的操纵事件,并相应地设置ManipulationOrigin和ManipulationStartingEventArgs.Mode。(免责声明:我曾经是创建这些API的团队的一部分)

感谢你的回答。向你和你的团队致以崇高的敬意,因为你们创建了这些出色的API!你们真棒。对于我的问题,我不想处理旋转,只想调整大小,但我还不知道该如何进行 :( - cdie
1
如果您不想旋转,则需要处理ManipulationStarting事件并将ManipulationStartingEventArgs.Mode设置为Scale | Translate。http://msdn.microsoft.com/en-us/library/vstudio/system.windows.input.manipulationstartingeventargs.mode(v=vs.100).aspx。这可能有效...虽然我不100%确定即使在禁用旋转的情况下,我们是否支持独立的X&Y ... - Robert Levy
是的,这就是我刚刚尝试过的,但它不起作用...是否有任何不同于Delta的事件来处理捏合,就像在RT程序集中一样? - cdie
这个回答并不有帮助。原帖作者并没有尝试旋转任何东西。 - torvin

0

从数学的角度来看,我认为有两种方法,第一种相对简单,但是当你能够让第二种方法工作时,它会更令人满意:

第一种方法: 您可以决定用户想要旋转还是缩放。 我会定义两个向量:vw和一个整数d,代表“距离”。

  • 将用户触摸的两个点视为XY。它们之间的距离为d
  • 将向量XY视为v
  • 将用户手指定义的新向量(X和Y)视为w

然后,您必须比较w的长度与d以及vw之间的角度,并将其视为alpha

例如,如果d*sin(degree) < d/4 ->应该重写为sin(degree)<0.25,则用户打算进行缩放,否则他旋转了矩形。

第二步: 这将允许用户同时旋转和缩放。

  • 取X和Y,定义向量v
  • 以矩形为例,例如左侧并命名该向量:a
  • 矩形可以定义为向量及其连接的(剪切)边(90度),因此将底部边的长度作为width

现在,如果用户对v向量进行变换,则对向量a执行相同操作,并使宽度变大/变小。 提示:https://processing.org/tutorials/transform2d/


OP在哪里说他们需要旋转任何东西? - torvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接