在WPF中,我有一个网格,其中包含我需要使用两个手指触摸手势进行操作的内容。下面的代码可以很好地用于移动和缩放,但是我需要知道如何限制最大和最小缩放值,例如100%到200%缩放。另外,我需要限制内容的移动,以使其保持在网格容器的大小之内。
到目前为止的代码:
Private Sub gridLeft_ManipulationStarting(发送方为对象,e为ManipulationStartingEventArgs)处理gridLeft.ManipulationStarting
e.ManipulationContainer = gridMapHolderLeft
e.Mode = ManipulationModes.Scale + ManipulationModes.Translate
e.Handled = True
MyBase.OnManipulationStarting(e)
结束子
私有子gridLeft_ManipulationDelta(发送方为对象,e为ManipulationDeltaEventArgs)处理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)
结束子
您可以通过检查结果矩阵来限制比例尺。应用比例尺后的行列式值。如果该值大于最大值或小于最小比例值,则可以在应用矩阵之前简单地从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并没有满足我们的要求。
我希望那里能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句