テスト用のUWPフォームでは、以下の基本的な操作テストがあります。 CanvasControlに3つの円を描き、翻訳とスケーリングの操作を設定します。操作のデルタ - 奇妙な効果とオーバーフローへの対応
これをタッチスクリーンでテストすると、基本的に画面上の2本の指の位置に基づいて円を翻訳してズームします。しかし、特定のポイントを超えてピンチダウンした場合、画像は2エクステント間で非常に急速に振動し始め、非常に迅速にコードがオーバーフローで停止する原因となります。
キャンバスコントロールをグリッドに配置し、グリッドコントロールからキャンバスコントロールの操作を試みましたが、ズームやパンの効果は正しくないようですが、同じ問題が発生しません。
私のコードのように見えますが、反復です。レンダリングトランスフォームの変更を引き起こす操作が別の操作を引き起こす可能性があり、それが落ち着くまで、または精度が問題になるまでおそらくタッチポイント間の距離が小さすぎるために、反復はオーバーフローするまで発散する。
これは予想されますか?これを行う正しい方法は何ですか?
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