WPF 通过操作调整矩形大小不会保持比率



我遇到了一个小问题。我正在 WPF 上设计一个将在 Windows 8.1 平板电脑上运行的应用程序。我正在构建一种"裁剪"软件(除其他外)。

为此,我在窗口上创建了一个矩形,并按照此处的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);

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

WPF 操作 API 不支持独立缩放 X 和 Y,同时又不支持旋转。

做这个练习...画一个矩形,并在上面的某个地方放两个点。 现在绘制相同的矩形,这两个点彼此对角线移动。 根据这些点之间的增量,您将如何确定用户是尝试旋转还是独立缩放 X 与 Y,还是同时进行两者? 由于我们拥有的有限信息,这是完全模棱两可的。

这就是为什么应用程序通常最终会具有特定的"手柄",您需要触摸才能明确进入"旋转"模式或"X/Y 调整大小模式"。 从实现的角度来看,您将处理该句柄上的操作事件(独立于控件本身),并相应地设置 ManipulationOrigin 和 ManipulationStartingEventArgs.Mode。

(免责声明:我是几年前创建这些 API 的团队的一员)

从数学的角度来看,我看到两种方式,第一种方式与第二种方法相比简单,但是当你能完成第二种工作时,它会更令人满意:

第一:您可以决定旋转或缩放是用户打算执行的操作。我会定义两个向量:v,w和一个整数,d,代表"距离"。

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

然后你必须比较wd的长度以及vw之间的角度,将其视为alpha

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

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

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

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

最新更新