打破累积转换

时间:2014-06-09 16:10:33

标签: c# wpf wpf-controls

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

  1. 第一个矩形我想放在(100,100)
  2. 第二个矩形我想放在(200,200)
  3. 第三个矩形我想放在(0,0)
  4. 我正在使用转换矩阵来实现如下:

    1. 要将第一个矩形定位在(100,100),请使用以下内容:

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

    2. 要将第二个矩形定位在(200,200),请使用以下内容: drawingContext.PushTransform(new TranslateTransform(100,100)); drawingContext.DrawRectangle(Brushes.Blue,null,new Rect(0,0,100,100));

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

    4. 通过设置Transform属性,可以在WinForms图形上进行如下操作:

      g.Transform = new Matrix();
      

      我们有什么方法可以打破WPF中的累积链

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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

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

答案 1 :(得分:-1)

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

我刚刚解决的其他可行解决方案是分别维护额外的Matrix 状态对象。

每当我们将任何转换推送到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(...);