我遇到了一个小问题。我正在 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
,代表"距离"。
- 将用户触摸的两个点作为
X
和Y
。它们之间的距离将是d
. - 取向量 XY 为 v
- 将用户手指(X 和 Y)定义的新向量作为 w
然后你必须比较w与d
的长度以及v和w之间的角度,将其视为alpha
。
例如,如果d
*sin( degree
) -> 应该重写为 sin(degree)<0.25,那么用户打算缩放,否则他旋转矩形。
第二:这将允许用户同时旋转和缩放。
- 取 X 和 Y,它们定义了 v。
- 以矩形为例,例如左侧并命名该向量:a
- 矩形可以定义为矢量及其连接的(纯粹)侧(90 度),因此将底边的长度作为
width
现在,如果用户使用 v 向量进行转换,则对向量 a 执行相同的操作并使宽度变大/变小。提示:https://processing.org/tutorials/transform2d/