WPF几何变换失效问题:重复绘制线条组无预期效果
解决WPF绘图中TransformGroup变换不生效的问题
我来帮你排查这个问题!你遇到的几何变换未生效的情况,核心原因是重复复用同一个TranslateTransform实例到TransformGroup中,再加上循环里的变换应用逻辑有问题,导致偏移没有正确叠加。
问题分析
- 重复添加同一个Transform实例:你在循环外创建了单个
TranslateTransform tt,然后每次循环都把它添加到同一个TransformGroup tg里。WPF的TransformGroup不会对同一个Transform实例进行多次叠加计算——因为它是同一个对象,重复添加不会产生累加偏移的效果,甚至可能被框架忽略。 - 变换应用时机错误:你的循环是先绘制图形,再往TransformGroup里添加变换,第一次绘制的是无偏移的原始图形,后续的变换叠加逻辑因为上述问题无法正常工作。
修正后的代码
我们可以简化逻辑,直接用单个TranslateTransform来控制偏移,不需要TransformGroup(因为这里只需要平移一种变换):
private void DrawElement(DrawingVisual dv) { using (var dvc = dv.RenderOpen()) { GeometryGroup gg = new GeometryGroup(); var pen = new Pen(Brushes.Black, 2); // 初始化单个平移变换,初始偏移为0 TranslateTransform translateTransform = new TranslateTransform(); gg.Transform = translateTransform; // 正确初始化所有顶点(修正了原代码中的注释干扰问题) Point lu = new Point(rct_center.Left, !IsMaxillar ? rct_center.Bottom - _pixelsPerMillimeter : _pixelsPerMillimeter + rct_center.Top); Point lb = new Point(lu.X, lu.Y + (!IsInverted ? -1 : 1) * rct_center.Height / 2); Point ru = new Point(rct_center.Right - _pixelsPerMillimeter, lu.Y); Point 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); // 计算每次绘制的偏移量,根据IsInverted确定方向 double offsetPerStep = (!IsInverted ? -1 : 1) * _pixelsPerMillimeter; // 循环绘制30组线条 for (int j = 0; j < 30; j++) { // 绘制当前偏移位置的线条组 dvc.DrawGeometry(Brushes.Transparent, pen, gg); // 更新平移变换的Y值,实现下一组线条的偏移 translateTransform.Y += offsetPerStep; } } }
关键修改说明
- 移除TransformGroup:因为只需要平移操作,单个
TranslateTransform足够,既简化代码又提升效率。 - 动态更新偏移量:每次绘制完成后,直接更新
TranslateTransform.Y的值,实现线条组的连续偏移,这样下一次绘制的图形会自动应用新的偏移。 - 修正顶点初始化:确保
lu、lb等顶点没有被错误注释,保证初始线条组的位置正确。
额外注意事项
如果之后需要组合多种变换(比如旋转+平移),再使用TransformGroup,那时要注意每次添加新的Transform实例,而不是复用同一个对象,否则同样会出现变换不生效的问题。
内容的提问来源于stack exchange,提问作者DrkDeveloper
相关产品推荐
相关产品推荐

