在 WPF 中快速呈现绘图视觉对象

本文关键字:绘图 视觉 对象 WPF | 更新日期: 2023-09-27 18:32:27

目前我在画布上有一个图像,我可以在我的应用程序中自由移动,我在其上渲染了 6 层 DrawingVisuals,但它似乎很慢。我正在使用RenderTargetBitmap来渲染视觉效果。有没有一种更快的方法来显示图像或我可以在画布上自由移动的任何其他框架元素上的视觉效果?

XAML:

<Canvas>
    <Image Height="505" HorizontalAlignment="Left" Margin="0,0,0,0" Name="_MapImage" Stretch="Fill" VerticalAlignment="Top" Width="700" MouseLeftButtonDown="_MapImage_MouseDown" MouseWheel="_MapImage_MouseWheel" MouseLeftButtonUp="_MapImage_MouseUp" MouseMove="_MapImage_MouseMove" />
</Canvas>

法典:

_renderRoutesBitmap = new RenderTargetBitmap((int)(_MapImage.Width), (int)(_MapImage.Height), 96, 96, PixelFormats.Default);
for (int i = 6; i < 8; ++i)
{
     if((layerCode / (int)Math.Pow(10,i) % 2) == 1)
     _renderRoutesBitmap.Render(_layers[i]); //takes too much time
}
_RouteImage.Source = _renderRoutesBitmap;

在 WPF 中快速呈现绘图视觉对象

前段时间我不得不做类似的事情,我必须编写自己的 GIS 应用程序。我不得不绘制成千上万的绘图视觉效果,我的发现是RenderTargetBitmap不是位图操作的好选择,因为它没有使用图形硬件加速。Silverlight有一个更合适的类; WriteableBitmap,它允许应用程序直接写入 GPU 缓冲区。唯一的问题是它仅适用于Silverlight。如果要坚持使用位图进行操作,则可以使用此处WriteableBitmapEx提供的等效的 WPF WriteableBitmap

由于您总共只有 6 个绘图视觉对象,因此我建议您改用更高级别的 UI 元素,例如形状等。

使用渲染显示视觉对象不是一个好的解决方案。如果您有 Canvas 并且想要渲染视觉效果,则无需将视觉效果转换为位图,此外,如果您进行转换,则无法在不降低质量的情况下将图像缩放任何数量(矢量图形的功能)。还有另一种可能性:创建自己的画布。我目前使用这种方法,绘制数千个形状没有问题。这是一个非常简单的例子:

public class DrawingCanvas : Panel
{

public List<Visual> visuals = new List<Visual>();

public void AddVisual(Visual visual)
{
    if (visual == null)
        return;
    this.visuals.Add(visual);
    base.AddVisualChild(visual);
    base.AddLogicalChild(visual);
}

public void RemoveVisual(Visual visual)
{
    if (visual == null)
        return;
    this.visuals.Remove(visual);
    base.RemoveVisualChild(visual);
    base.RemoveLogicalChild(visual);
}
}

使用 DrawingCanvas 而不是 Canvas 类。