限制操作增量双指触摸

本文关键字:触摸 操作 | 更新日期: 2023-09-27 18:32:41

在 WPF 中,我有一个网格,其中包含一段需要使用双指触摸手势操作的内容。下面的代码适用于移动和缩放,但我需要知道如何限制最大和最小缩放值 - 例如,100% 到 200% 缩放。此外,我需要限制内容的移动,使其保持在网格容器的大小范围内。

到目前为止的代码:

Private Sub gridLeft_ManipulationStarting(sender As Object, e As ManipulationStartingEventArgs) Handles gridLeft.ManipulationStarting
  e.ManipulationContainer = gridMapHolderLeft
  e.Mode = ManipulationModes.Scale + ManipulationModes.Translate
  e.Handled = True
  MyBase.OnManipulationStarting(e)
End Sub
Private Sub gridLeft_ManipulationDelta(sender As Object, e As ManipulationDeltaEventArgs) Handles gridLeft.ManipulationDelta
  Dim element As UIElement = TryCast(e.Source, UIElement)
  Dim xform As MatrixTransform = TryCast(element.RenderTransform, MatrixTransform)
  Dim matrix As Matrix = xform.Matrix
  Dim delta As ManipulationDelta = e.DeltaManipulation
  Dim center As Point = e.ManipulationOrigin
  matrix.Translate(-center.X, -center.Y)
  matrix.Scale(delta.Scale.X, delta.Scale.Y)
  matrix.Translate(center.X, center.Y)
  matrix.Translate(delta.Translation.X, delta.Translation.Y)
  xform.Matrix = matrix
  e.Handled = True
  MyBase.OnManipulationDelta(e)
End Sub

限制操作增量双指触摸

您可以通过检查生成的矩阵来限制比例。应用缩放后的行列式值。如果该值高于最大值或低于最小刻度值,则只需在应用矩阵之前从 Sub 返回即可。

在此示例中,最小值为无缩放比例 (1.0(,最大值为 2x 缩放 (2.0(。

(请原谅我的 VB 代码 - 我 99.9% 的时间都是 C# 开发人员!

Private Sub gridLeft_ManipulationDelta(sender As Object, e As ManipulationDeltaEventArgs) Handles gridLeft.ManipulationDelta
  Dim element As UIElement = TryCast(e.Source, UIElement)
  Dim xform As MatrixTransform = TryCast(element.RenderTransform, MatrixTransform)
  Dim matrix As Matrix = xform.Matrix
  Dim delta As ManipulationDelta = e.DeltaManipulation
  Dim center As Point = e.ManipulationOrigin
  matrix.Translate(-center.X, -center.Y)
  matrix.Scale(delta.Scale.X, delta.Scale.Y)
  matrix.Translate(center.X, center.Y)
  matrix.Translate(delta.Translation.X, delta.Translation.Y)
  If matrix.Determinant >= 2.0 Or matrix.Determinant <= 1.0 Then
     Return
  End If
  xform.Matrix = matrix
  e.Handled = True
  MyBase.OnManipulationDelta(e)
End Sub

我正在重构仅提供这些功能的 WPF 行为。它是用 C# 编写的,而不是 VB - 但您可能会对源代码感兴趣。特别是"ManipulationDeltaHandler"方法中的代码。

其中还有代码可以检查缩放元素与其容器元素的边界,以防止您将内容推送或缩放到视图之外。

我最终写了这个行为,因为Microsoft提供的 TranslateZoomRotateBehavior 并没有做我们需要做的事情。

我希望里面有一些东西可以提供帮助。