Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打破累积变换_C#_Wpf_Wpf Controls - Fatal编程技术网

C# 打破累积变换

C# 打破累积变换,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我正在使用DrawingContext对象绘制一系列矩形。我的要求是: 我要放置在(100100)处的第一个矩形 我想放置在(200200)处的第二个矩形 要放置在(0,0)处的第三个矩形 我使用转换矩阵来实现它,如下所示: g.Transform = new Matrix(); 要将第一个矩形定位在(100100),我使用以下命令: PushTransform(新的TranslateTransform(100100)); drawingContext.DrawRectangle(Brushe

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

  • 我要放置在(100100)处的第一个矩形
  • 我想放置在(200200)处的第二个矩形
  • 要放置在(0,0)处的第三个矩形
  • 我使用转换矩阵来实现它,如下所示:

    g.Transform = new Matrix();
    
  • 要将第一个矩形定位在(100100),我使用以下命令:

    PushTransform(新的TranslateTransform(100100)); drawingContext.DrawRectangle(Brushes.Blue,null,new Rect(0,01000100))

  • 要将第二个矩形定位在(200200),我使用以下命令: PushTransform(新的TranslateTransform(100100)); drawingContext.DrawRectangle(Brushes.Blue,null,new Rect(0,01000100))

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

  • 在WinForms graphics上,可通过如下设置转换属性实现此操作:

    g.Transform = new Matrix();
    
    我们有没有办法打破WPF中的累积链?您可以这样做:

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

    该方法将转换重置为调用
    PushTransform()

    之前的状态。一种可能的解决方法是多次调用Pop()。但是,由于Pop()不仅会弹出变换,还会弹出最后一个不透明度遮罩、不透明度、剪辑等,因此它不适合我的需要

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

    每当我们将任何转换推到
    DrawingContext
    对象上时,我们还需要将该对象预先添加到该状态对象上

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

        //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(...);
    
    Pop()是一个可能的选项。但我需要知道,单次分配是否有可能打破整个链条。在这个特定的示例中,我需要调用Pop()两次。