【问题标题】:WPF DrawingContext: How to keep existing content when draw new content?WPF DrawingContext:绘制新内容时如何保留现有内容?
【发布时间】:2015-10-31 04:09:45
【问题描述】:

我有一个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 会自动清除现有的葡萄树。所以想问一下在绘制新几何体时如何保留现有的绘图内容?谢谢!

【问题讨论】:

    标签: c# wpf geometry drawingcontext


    【解决方案1】:

    来自文档:

    当您调用 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。你知道比这更好的方法吗?
    • @TuyenTk: “你知道比这更好的吗” -- 抱歉...缺少更多细节,即使作为一个实际的答案也太宽泛了堆栈溢出问题,不要介意作为评论。这取决于太多不同的事情。请注意,在您当前的方法中,视觉仍然需要存储您的“数千个几何图形”的图形,除了 Drawing 对象(因此它们实际上是比 Geometry 对象更多的数据)。自定义控件可能会为您提供更好的性能(如果您确实遇到性能问题)。
    • @TuyenTk:至于渲染到位图的选项,如果操作正确,那应该是最不影响性能的,因为您只需要绘制到添加新对象的位图;一旦它们被绘制到位图中,实际上显示位图是非常有效的。最大的缺点是位图具有固定数量的像素/分辨率,因此无法适应窗口/容器大小的变化。但这在实践中通常不是一个缺点,即当位图只会以单一尺寸显示时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2017-02-07
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多