前提・実現したいこと
WPFでGUIアプリを作っています.
Canvasをマウスホイールクリックを使って移動させたいです.
Canvasだけではなく,Canvas上にあるオブジェクトも一緒に移動させたいです.
- マウスホイールでスクロール => Canvas倍率変化
- マウスホイールでドラッグドロップ => Canvas移動
ぶつかっている場所
Canvasの倍率変化はできましたが,Canvasの移動で,ホイールをクリックしたときにうまく動きません.
理想としては,マウスホイールをクリックしたときのカーソルのポジションから,ドラッグした分だけCanvasが移動するということをやりたいのですが,ホイールをクリックすると,一瞬Canvasの左上の原点がカーソルの位置に合わさってまた戻るという変な挙動を示します.
この動作をなくしたいのですが,どう修正すればいいでしょうか.
ちなみにこの挙動さえ目をつぶれば,Canvas移動はできています.
該当のソースコード
View
Xaml
1 <Viewbox Grid.Row="1" Height="512" Width="512" Stretch="Uniform" ClipToBounds="True" x:Name="viewbox"> 2 <Canvas Height="512" Width="512" AllowDrop="True" 3 x:Name="canvas" 4 MouseDown="Canvas_MouseDown" 5 MouseUp="Canvas_MouseUp" 6 MouseMove="Canvas_MouseMove" 7 MouseWheel="Canvas_MouseWheel"> 8 9 <Canvas.RenderTransform> 10 <TransformGroup x:Name="CanvasTransformGroup"> 11 <ScaleTransform x:Name="CanvasScaleTransform" CenterX="256" CenterY="256"/> 12 <TranslateTransform x:Name="CanvasTranslateTranform" X="0" Y="0"/> 13 </TransformGroup> 14 </Canvas.RenderTransform> 15 <Image Source="/Resources/sample.jpg" Height="512" Width="512" Stretch="UniformToFill" x:Name="image"/> 16 <Path> 17 <Path.Data> 18 <EllipseGeometry Center="130 130" 19 RadiusX="20" 20 RadiusY="20"/> 21 </Path.Data> 22 </Path> 23 </Canvas> 24 </Viewbox> 25
コードビハインド
C#
1 private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) 2 { 3 const double scale_rate = 1.1; 4 if (e.Delta > 0) 5 { 6 CanvasScaleTransform.ScaleX *= scale_rate; 7 CanvasScaleTransform.ScaleY *= scale_rate; 8 } 9 else 10 { 11 CanvasScaleTransform.ScaleX /= scale_rate; 12 CanvasScaleTransform.ScaleY /= scale_rate; 13 } 14 } 15 16 private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 17 { 18 if (e.MiddleButton == MouseButtonState.Pressed) 19 { 20 canvas.CaptureMouse(); 21 start = e.GetPosition(viewbox); 22 } 23 } 24 25 private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) 26 { 27 if (e.MiddleButton == MouseButtonState.Released) 28 canvas.ReleaseMouseCapture(); 29 } 30 31 private void Canvas_MouseMove(object sender, MouseEventArgs e) 32 { 33 if (canvas.IsMouseCaptured) 34 { 35 Vector v = start - e.GetPosition(viewbox); 36 CanvasTranslateTranform.X = -v.X; 37 CanvasTranslateTranform.Y = -v.Y; 38 } 39 } 40 }

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。