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
对象绘制一系列矩形。我的要求是:
g.Transform = new Matrix();
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()两次。