You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AvaloniaUI中使用RenderTargetBitmap绘制时如何禁止自动清空?

解决RenderTargetBitmap绘图自动清空的问题

RenderTargetBitmap每次调用CreateDrawingContext()时,默认会生成一个清空原有内容的绘图上下文,所以你每次绘制都会覆盖之前的结果。要实现累积绘制,有两种常用方案:

方案一:用DrawingGroup累积矢量绘图内容(推荐)

先创建一个全局的DrawingGroup来存储所有要绘制的内容,每次新增线条时往这个组里添加,最后再一次性渲染到RenderTargetBitmap。这种方式是矢量级别的累积,效率高且无像素损失。

// 定义全局变量存储累积的绘图内容
private DrawingGroup _accumulatedDrawings = new DrawingGroup();

// 每次绘制新线条的逻辑
using (var dc = _accumulatedDrawings.Open())
{
    Pen pen = new Pen(Brushes.Black, 1);
    dc.DrawLine(pen, previousPoint, currentPoint);
}

// 将累积的内容渲染到RenderTargetBitmap
RenderTargetBitmap WorldImage = new RenderTargetBitmap(
    (int)yourCanvas.ActualWidth, 
    (int)yourCanvas.ActualHeight, 
    96, 96, 
    PixelFormats.Pbgra32
);
WorldImage.Render(new DrawingImage(_accumulatedDrawings));

方案二:位图级别的内容复制(不推荐,仅适用于特殊场景)

如果必须直接操作RenderTargetBitmap的上下文,可以先把当前位图内容复制到临时对象,绘制前先还原原有内容,再添加新线条。这种方式是像素级复制,多次操作后性能会下降,且缩放时易失真。

// 假设WorldImage是已存在的RenderTargetBitmap
WriteableBitmap tempBitmap = new WriteableBitmap(WorldImage);

using (var context = WorldImage.CreateDrawingContext())
{
    // 先绘制之前保存的原有内容
    context.DrawImage(tempBitmap, new Rect(0, 0, WorldImage.Width, WorldImage.Height));
    // 再绘制新线条
    Pen pen = new Pen(Brushes.Black);
    context.DrawLine(pen, previousPoint, currentPoint);
}

内容的提问来源于stack exchange,提问作者martinrhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:49:56