如何在墨迹上进行缩放和旋转?

使用以下XAML:

           

我试图围绕图像的中心旋转,并使用滚轮鼠标进行缩放。 我已经设置了这个转换组和事件:

 public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(); transformGroup = new TransformGroup(); scaleTransform = new ScaleTransform(); rotateTransform = new RotateTransform(); translateTransform = new TranslateTransform(); transformGroup.Children.Add(rotateTransform); transformGroup.Children.Add(scaleTransform); transformGroup.Children.Add(translateTransform); imgViewbox.RenderTransform = transformGroup; imgViewbox.MouseWheel += ImageViewboxMouseWheel; } 

旋转很简单:

 void Rotate(object sender, RoutedEventArgs e) { //imgViewbox.RenderTransformOrigin = new Point(0.5,0.5); rotateTransform.Angle += 90; } 

但是缩放正在做各种奇怪的东西在屏幕上跳跃。 缩放代码在这里:

 void ImageViewboxMouseWheel(object sender, MouseWheelEventArgs e) { //imgViewbox.RenderTransformOrigin = new Point(0, 0); double zoomFactor = DefaultZoomFactor; if (e.Delta <= 0) zoomFactor = 1.0 / DefaultZoomFactor; // DoZoom requires both the logical and physical location of the mouse pointer var physicalPoint = e.GetPosition(imgViewbox); if (transformGroup.Inverse != null) { DoZoom(zoomFactor, transformGroup.Inverse.Transform(physicalPoint), physicalPoint); } else { throw new ArgumentException("Missing Inverse"); } //Set the center point of the ScaleTransform object to the cursor location. scaleTransform.CenterX = e.GetPosition(imgViewbox).X; scaleTransform.CenterY = e.GetPosition(imgViewbox).Y; Debug.WriteLine(string.Format("IVMW Center {0},{1}", scaleTransform.CenterX, scaleTransform.CenterY)); } public void DoZoom(double deltaZoom, Point mousePosition, Point physicalPosition) { double currentZoom = scaleTransform.ScaleX; currentZoom *= deltaZoom; translateTransform.X = -1*(mousePosition.X*currentZoom - physicalPosition.X); translateTransform.Y = -1*(mousePosition.X*currentZoom - physicalPosition.Y); scaleTransform.ScaleX = currentZoom; scaleTransform.ScaleY = currentZoom; } 

我尽可能地删除了动画等。 希望只留下关键部分。 我认为主要的问题是scaleTransform.Center [X | Y],因为即使我尝试在同一位置完全点击,返回的数字也都在象限上。 RenderTransformOrigin似乎与中心位置没有任何区别,但我知道我需要它围绕中心旋转。

我究竟做错了什么?

您需要抵消在TranslateTransform中更改ScaleTranform的CenterX / Y所获得的跳转,这是我写的pan&zoom控件的片段:

 private void This_MouseWheel(object sender, MouseWheelEventArgs e) { if (IsZoomEnabled) { Point cursorPos = e.GetPosition(this); Point newCenter = _scaleT.Inverse.Transform(_translateT.Inverse.Transform(cursorPos)); Point oldCenter = new Point(_scaleT.CenterX, _scaleT.CenterY); Vector oldToNewCenter = newCenter - oldCenter; _scaleT.CenterX = newCenter.X; _scaleT.CenterY = newCenter.Y; _translateT.X += oldToNewCenter.X * (_scaleT.ScaleX - 1.0); _translateT.Y += oldToNewCenter.Y * (_scaleT.ScaleY - 1.0); ... 

希望您可以根据您的代码进行调整。 计算新中心的位置可能需要考虑RotateTransform。