为什么这种几何变换不起作用?
private void DrawElement(DrawingVisual dv)
{
using (var dvc = dv.RenderOpen())
{
GeometryGroup gg = new GeometryGroup();
var pen = new Pen(Brushes.Black, 2);
TranslateTransform tt = new TranslateTransform(0, (!IsInverted ? -1 : 1) * _pixelsPerMillimeter);
TransformGroup tg = new TransformGroup();
Point lu, lb, ru, rb;
lu = new Point(rct_center.Left, (!IsMaxillar ? rct_center.Bottom - _pixelsPerMillimeter : _pixelsPerMillimeter + rct_center.Top));//
lb = new Point(lu.X, lu.Y + (!IsInverted ? -1 : 1) * rct_center.Height / 2);//
ru = new Point(rct_center.Right - _pixelsPerMillimeter, lu.Y);//
rb = new Point(ru.X, lb.Y);//
LineGeometry upperLeft = new LineGeometry(lu, new Point(lu.X + _pixelsPerMillimeter, lu.Y));
LineGeometry bottomLeft = new LineGeometry(lb, new Point(lb.X + _pixelsPerMillimeter, lb.Y));
LineGeometry upperRight = new LineGeometry(ru, new Point(ru.X + _pixelsPerMillimeter, ru.Y));
LineGeometry bottomRight = new LineGeometry(rb, new Point(rb.X + _pixelsPerMillimeter, rb.Y));
gg.Children.Add(upperLeft);
gg.Children.Add(bottomLeft);
gg.Children.Add(upperRight);
gg.Children.Add(bottomRight);
for (int j = 30 - 1; j >= 0; --j) //-1 because the start line isn't drawn.
{
dvc.DrawGeometry(Brushes.Transparent, pen, gg);
tg.Children.Add(tt);
gg.Transform = tg;
}
}
}
我想重复绘制前面或反之下的4行组(如果是IsInverted)。 当我调试变换组矩阵被修改,但变换没有应用于几何组。 我是wpf的新手,来自winforms,如果没有GDI GraphicsPath,我有点失落。
有一些方法可以做得更好吗?也许我正在用GDI的方式思考这个问题。
答案 0 :(得分:0)
您要在此处执行的是使用渲染上下文(dvc
)的Push方法,而不是依赖于几何对象本身的Transform。使用图形上下文时,WPF依赖于Push / Pop操作来设置变换。您可以在此处查看相关的答案:How do you apply a Scale Translation to a DrawingContext?
此外,我认为您需要研究C#如何处理引用类型。在示例代码中使用它的方式,是将变换的相同实例分配给每个几何对象,我认为这不是故意的。我不确定Push
方法是在调用期间还是在调用之后使用上下文;您必须尝试一下。在内部循环中创建新的TranslateTransform
是避免这种情况的肯定方法。但是,我同意评论员的观点,即使用某些offset属性会更有效。