WPF绘图上下文:如何在绘制新内容时保留现有内容?

4

我有一个DrawingVisual,想要画一棵葡萄树并在屏幕上显示,之后再画一只狐狸。就像这样:

public class Gif : DrawingVisual
{
    void Draw_Geometry(Geometry geo)
    {
        using (DrawingContext dc = RenderOpen())
        {
            dc.DrawGeometry(Brushes.Brown, new Pen(Brushes.Brown, 0), geo);
        }
    }

    void Draw_Grape ()
    {
        Draw_Geometry(grape);
    }

    void Draw_Fox ()
    {
        Draw_Geometry(fox);
    }
}

问题是当调用Draw_Fox()时,DrawingContext自动清除现有的葡萄树。所以我想问一下,在绘制新几何图形时如何保留现有的绘图内容?谢谢!

1个回答

2

根据文档:

当您调用DrawingContext的Close方法时,当前绘图内容将替换为DrawingVisual定义的任何先前绘图内容。这意味着无法将新的绘图内容附加到现有绘图内容。

我觉得这很清楚。不能按照您要求字面上地做到。打开可视化进行渲染将始终导致新的渲染替换之前的内容。

如果您想要附加当前渲染,您需要显式包含它。例如:

void Draw_Geometry(Geometry geo)
{
    using (DrawingContext dc = RenderOpen())
    {
        dc.DrawDrawing(Drawing);
        dc.DrawGeometry(Brushes.Brown, new Pen(Brushes.Brown, 0), geo);
    }
}

谢谢你的回答,非常清楚!我只需要逐个将几何图形显示在屏幕上,其他情况下不做任何操作。我有成千上万个几何图形要显示,所以将它们作为形状/路径元素添加是没有意义的。现在我知道的一个解决方案是将Visual渲染到RenderTargetBitmap,然后将该位图添加到一个图像控件中。但是渲染需要很长时间和CPU资源。你知道有比这更好的方法吗? - Thanh Nguyen
@TuyenTk:你知道比这更好的方法吗?抱歉...缺少更多细节,即使作为实际的Stack Overflow问题,也太广泛了,更不用说作为评论回答了。这取决于太多不同的事情。请注意,在您当前的方法中,视觉仍然需要存储您的“成千上万个几何图形”的图形,除了作为“Drawing”对象(因此它们实际上比只是“Geometry”对象更多的数据)。如果确实遇到性能问题,自定义控件可能会提供更好的性能。 - Peter Duniho
就渲染到位图的选项而言,如果正确执行,那应该是对性能影响最小的,因为只需要在添加新对象时绘制到位图上;一旦它们被绘制到位图中,实际显示位图非常高效。最大的缺点是位图具有固定数量的像素/分辨率,因此无法适应窗口/容器大小的变化。但在实践中通常不是缺点,即当位图仅以单个大小显示时。 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接