WPF应用几何变换

时间:2018-03-23 16:40:34

标签: c# wpf geometry transformation

为什么这种几何变换不起作用?

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,我有点失落。

I want something like this

有一些方法可以做得更好吗?也许我正在用GDI的方式思考这个问题。

1 个答案:

答案 0 :(得分:0)

您要在此处执行的是使用渲染上下文(dvc)的Push方法,而不是依赖于几何对象本身的Transform。使用图形上下文时,WPF依赖于Push / Pop操作来设置变换。您可以在此处查看相关的答案:How do you apply a Scale Translation to a DrawingContext?

此外,我认为您需要研究C#如何处理引用类型。在示例代码中使用它的方式,是将变换的相同实例分配给每个几何对象,我认为这不是故意的。我不确定Push方法是在调用期间还是在调用之后使用上下文;您必须尝试一下。在内部循环中创建新的TranslateTransform是避免这种情况的肯定方法。但是,我同意评论员的观点,即使用某些offset属性会更有效。