使用matrixtransform在WPF中进行缩放和平移时出了什么问题

时间:2017-05-07 09:49:50

标签: c# wpf canvas

我在here有一个项目。我使用matrixtransform进行缩放和平移。他们按照我的预期工作。我跑的时候有两个麻烦。

  1. 当我在画布上缩放所有对象然后平移它们时,我发现了一些错误。距离移动光标与平移时移动所有对象的距离不同。我认为我的错误是在我的项目中使用的matrixtransform(可能是对于平移功能的矩阵变换的比例效应因素),但我无法解决它。
  2. 代码隐藏:

    - 这是我的平移功能代码:

    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. 我想通过按钮显示画布上的所有对象(如果通过缩放隐藏对象)。但是我不知道如何在C#中编写缩放范围点击功能(你可以在MainWindow.xaml的56行看到它)。
    2. 请告知我这些情况并感谢您的建议!

1 个答案:

答案 0 :(得分:-1)

我相信你需要的是布局转换或渲染转换。以下是两者的比较:

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

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