【问题标题】:WPF applying geometry transformWPF 应用几何变换
【发布时间】:2020-12-01 03:29:16
【问题描述】:

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

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 的方式想了很多。

【问题讨论】:

  • @Clemens 编辑图片和新解释。
  • 这只是在您覆盖 OnRender 的 UIElement 的四个角处具有固定长度和距离的固定行数?一条线覆盖整个宽度?为什么要完全覆盖 OnRender,而不是将 Image 元素和您的绘图(例如在 Canvas 中)放在一个共同的父元素中,例如网格?如果你认真地问如何“做得更好”,你需要在你的问题中添加更多的细节。
  • 这是我在 Winforms 中做的一个自定义控件,我想移植(并在此过程中学习)到 WPF:i.imgur.com/fsIw5uf.png 我想绘制标尺,但这取决于控制。所有单元格都是可编辑的。我实现了在 WPF 中重新创建表格,我实现了在 WPF 中重新创建牙齿图像。绘制的线取决于单元格的值。并且可以删除牙齿等...
  • 我仍然觉得这很令人困惑。为什么要改变而不是仅仅使用起始 Y 来定义它们的去向?您多次设置变换属性 - 为什么不设置一次?
  • 我该怎么做? @Andy 我必须多次绘制 4 行组,然后我必须对其进行转换或重新创建 4 行。什么性能更高?

标签: c# wpf geometry transformation


【解决方案1】:

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

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

【讨论】:

  • 哇,我不记得这个问题了。感谢您的回答,但这次我了解了 WPF 的工作原理(2 年很多)。最后我以正确的方式做到了,我为标尺本身制作了一个自定义 UIElement 并在其中创建了逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2020-12-13
  • 1970-01-01
相关资源
最近更新 更多