In einem Test-UWP-Formular habe ich einen grundlegenden Manipulationstest, Code unten. Er zeichnet 3 Kreise auf einem CanvasControl und richtet Manipulationen für die Übersetzung und Skalierung ein.Reagieren auf Manipulationsdelta - merkwürdiger Effekt und Überlauf
Wenn ich dies auf einem Touchscreen teste, mache ich grundsätzlich das, was ich erwarte, indem ich die Kreise basierend auf der Position von 2 Fingern auf dem Bildschirm übersetze und zoome. Wenn ich jedoch einen bestimmten Punkt abschneide, beginnt das Bild sehr schnell zwischen 2 Extents zu oszillieren und wird sehr schnell dazu führen, dass der Code mit einem Überlauf stoppt.
Ich legte die Canvas-Steuerelement in ein Raster und versuchte, die Manipulation auf der Leinwand Steuerung aus dem Raster-Steuerelement, und es leidet nicht an dem gleichen Problem, obwohl die Auswirkungen von Zoom und Schwenken scheint nicht korrekt.
So sieht der Effekt meines Codes aus, wie es ist, ist eine Iteration, wo eine Manipulation, die eine Rendertransformationsänderung verursacht, eine andere Manipulation verursachen kann und in Kreisen verläuft, bis sie sich einstellt - oder wenn ein Genauigkeitsproblem vorliegt , vielleicht weil der Abstand zwischen den Berührungspunkten zu klein wird, divergiert die Iteration bis zum Überlauf.
Wird das erwartet? Was ist der richtige Weg, dies zu tun?
Private WithEvents Canv As New CanvasControl
Private WithEvents gr As New Grid
Private Sub Canv_Draw(sender As CanvasControl, args As CanvasDrawEventArgs) Handles Canv.Draw
args.DrawingSession.DrawCircle(50, 50, 25, Windows.UI.Colors.Blue)
args.DrawingSession.DrawCircle(250, 250, 25, Windows.UI.Colors.Blue)
args.DrawingSession.DrawCircle(500, 500, 25, Windows.UI.Colors.Blue)
End Sub
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Content = gr
gr.Children.Add(Canv)
Canv.ManipulationMode = ManipulationModes.Scale Or ManipulationModes.TranslateX Or ManipulationModes.TranslateY
end sub
Private Sub Canv_ManipulationDelta(sender As Object, e As ManipulationDeltaRoutedEventArgs) Handles Canv.ManipulationDelta
Dim t As New TranslateTransform
t.X = e.Cumulative.Translation.X
t.Y = e.Cumulative.Translation.Y
Dim s As New ScaleTransform
s.ScaleX = e.Cumulative.Scale
s.ScaleY = e.Cumulative.Scale
s.CenterX = e.Position.X
s.CenterY = e.Position.Y
Dim g As New TransformGroup
g.Children.Add(s)
g.Children.Add(t)
Canv.RenderTransform = g
End Sub