打破累积转换

本文关键字:转换 | 更新日期: 2023-09-27 18:07:52

我使用DrawingContext对象来绘制一系列矩形。我的要求是这样的:

    第一个矩形的位置是(100,100)第二个矩形的位置是(200,200)
  1. 第三个矩形(0,0)

我使用变换矩阵实现如下:

  1. 将第一个矩形定位在(100,100)处,我使用以下命令:

    drawingContext。PushTransform(new TranslateTransform(100,100));drawingContext.DrawRectangle(画笔。蓝色,null, new Rect(0,0,100,100));

  2. 将第二个矩形定位在(200,200)处,我使用以下命令:drawingContext。PushTransform(new TranslateTransform(100,100));drawingContext.DrawRectangle(画笔。蓝色,null, new Rect(0,0,100,100));

  3. 要将第三个矩形定位在(0,0),我可以使用(-200,-200)。但我很好奇有没有办法替换这个累积链并用新的位置覆盖整个矩阵如:drawingContext。PushTransform(new TranslateTransform(0,0));

这可以在WinForms图形中通过如下方式设置Transform属性:

g.Transform = new Matrix();

在WPF中有没有办法打破这个累积链

打破累积转换

你可以这样做:

drawingContext.PushTransform(new TranslateTransform(100, 100));      
drawingContext.DrawRectangle(Brushes.Blue, null, new Rect(0, 0, 100, 100));
drawingContext.Pop();

Pop()方法将转换重置为调用PushTransform()之前的状态。

一种可能的解决方法是多次调用Pop()。但是由于Pop()不仅弹出变换,而且弹出最后的不透明度蒙版,不透明度,剪辑等,它不适合我的需要。

我刚刚想出的另一个可能的解决方案是单独维护额外的矩阵状态对象。

当我们将任何转换推入DrawingContext对象时,我们还需要将该对象附加到状态对象上。

最后,当我们想要完全打破这个链时,我们可以反转状态矩阵的状态并将其推到DrawingContext对象上。这将在DrawingContext对象上设置转换状态为单位矩阵。

    //Keep a state matrix
    Matrix state = new Matrix();
    //First transform
    MatrixTransform transform1 = new MatrixTransform();
    Matrix matrix1 = new Matrix();
    matrix1.OffsetX = 100;
    matrix1.OffsetY = 100;           
    transform1.Matrix = matrix1;
    drawingContext.PushTransform(transform1);
    state.Prepend(matrix1);
    drawingContext.DrawRectangle(..);
    //Second transform
    MatrixTransform transform2 = new MatrixTransform();
    Matrix matrix2 = new Matrix();
    matrix2.OffsetX = 400;
    matrix2.OffsetY = 400;           
    transform2.Matrix = matrix2;
    drawingContext.PushTransform(transform2);
    state.Prepend(matrix2);
    drawingContext.DrawRectangle(..);

    //Finally reset to identity matrix.
    //Inverse the state matrix
    state.Invert(); 
    //Apply this inverted matrix to DrawingContext to get identity matrix.
    MatrixTransform transform3 = new MatrixTransform();
    transform3.Matrix = state;
    drawingContext.PushTransform(transform3);
    drawingContext.DrawRectangle(...);