在WPF中使用MatrixTransform进行缩放和平移时,有问题



我在这里有一个项目。我使用matrixtransform进行缩放和平移。他们按照我的期望工作。我运行它有两个麻烦。

  1. 当我放大画布上的所有对象,然后将它们放置时,我发现了一些问题。距离移动光标在平移时移动所有对象的距离并不相同。我认为我的错误是我的项目中使用的matrixtransform(也许是panning函数的矩阵效应的效果(,但我无法解决。

代码范围:

- 这是我用于平宁功能的代码:

private void canvas01_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.MiddleButton == MouseButtonState.Pressed)
            {
                canvas01.Cursor = Cursors.SizeAll; //set mouse shape is panning type
                var lsPoint = e.GetPosition(this);
                var res = lsPoint - firstPoint;
                foreach (UIElement element in canvas01.Children)
                {
                    var transform = element.RenderTransform as MatrixTransform;
                    var matrix = transform.Matrix;
                    matrix.TranslatePrepend(res.X, res.Y);
                    transform.Matrix = matrix;
                }
                //udate first point
                firstPoint = lsPoint;
            }
        }

- 这是我的缩放/输出功能的代码:

private void canvas01_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            foreach (UIElement element in canvas01.Children)
            {
                //var element = sender as UIElement;
                var position = e.GetPosition(element);
                var transform = element.RenderTransform as MatrixTransform;
                var matrix = transform.Matrix;
                var scale = e.Delta >= 0 ? 1.1 : (1.0 / 1.1); // choose appropriate scaling factor
                matrix.ScaleAtPrepend(scale, scale, position.X, position.Y);
                transform.Matrix = matrix;
            }
        }
  1. 我想通过按钮在画布上显示所有对象(如果对象被缩放隐藏(。但是我不知道如何编写缩放范围点击函数(您可以在mainwindow.xaml中的56行中看到它(。

在这些情况下,请告知我,并感谢您的建议!

我相信您需要的是布局变换或渲染变换。这是两者的比较:

http://blog.scottlogic.com/2008/12/19/layouttransform-vs-rendertransform-whats-whats-whats-whats-y-difference.html

他们的行为略有不同,但应该满足您的需求并在您的项目中解决。