WPF缩放canvas中心鼠标位置

                                              

使用“左”和“顶”点固定参考点以缩放“canvas”。 我想放大并缩小鼠标指针。 如何将其纳入MVVM模式? (不在代码后面)。 使用鼠标滚轮,我可以放大canvas。 我已经使用了RenderTransformOrigin,CenterX,CenterY,但它没有用。 我想我采取了错误的做法。 请帮我..

由于您没有提供当前的缩放代码,因此以下是缩放鼠标位置的一般示例:

         

使用更新转换矩阵的代码:

 private void Grid_MouseWheel(object sender, MouseWheelEventArgs e) { var matTrans = grid2.RenderTransform as MatrixTransform; var pos1 = e.GetPosition(grid1); var scale = e.Delta > 0 ? 1.1 : 1 / 1.1; var mat = matTrans.Matrix; mat.ScaleAt(scale, scale, pos1.X, pos1.Y); matTrans.Matrix = mat; e.Handled = true; } 

我把@ Grek40的代码转换成了一个Behavior ,试图坚持使用MVVM模式。 如果你对此进行投票,请记得也要对他的答案进行投票,因为我的投票是基于他的工作。 它需要System.Windows.Interactivity.WPF nuget包(或其他一些框架)用于Behavior基类。 您可以将此应用于任何UIElement 。 它会自动为您添加MatrixTransform ,因此您不必在XAML中执行此操作(它将覆盖任何现有的转换)。

 public class ZoomOnMouseWheel : Behavior { public Key? ModifierKey { get; set; } = null; public TransformMode TranformMode { get; set; } = TransformMode.Render; private Transform _transform; protected override void OnAttached() { if (TranformMode == TransformMode.Render) { _transform = AssociatedObject.RenderTransform = new MatrixTransform(); } else { _transform = AssociatedObject.LayoutTransform = new MatrixTransform(); } AssociatedObject.MouseWheel += AssociatedObject_MouseWheel; } protected override void OnDetaching() { AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel; } private void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e) { if ((!ModifierKey.HasValue || !Keyboard.IsKeyDown(ModifierKey.Value)) && ModifierKey.HasValue) { return; } if (!(_transform is MatrixTransform transform)) { return; } var pos1 = e.GetPosition(AssociatedObject); var scale = e.Delta > 0 ? 1.1 : 1 / 1.1; var mat = transform.Matrix; mat.ScaleAt(scale, scale, pos1.X, pos1.Y); transform.Matrix = mat; e.Handled = true; } } public enum TransformMode { Layout, Render, } 

你可以像这样使用它:

       

不要忘记xmlns

 xmlns:interactivity="http://schemas.microsoft.com/expression/2010/interactivity"