【发布时间】: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