从 IRenderableSeriesViewModel 将图表渲染到内存中的位图

Rendering chart to bitmap in memory from IRenderableSeriesViewModel

我已经在支持论坛上阅读了有关让 SciChart 将图表渲染到内存的指南。但是,那里的示例使用 FastLineRenderableSeries,而在我的项目中,我使用 IRenderableSeriesViewModel 并使用 ObservableCollection<IRenderableSeriesViewModel>.

在 XAML 中使用系列绑定

当我尝试按照 SciChart Knowledgebase 上的指南进行操作时,它使用 FastLineRenderableSeries 作为 RenderableSeries,当我尝试分配我预先存在的 [=] 时它不起作用14=] 到 RenderableSeries 属性 SciChartSurface

我想知道当我尝试将现有绘图导出到位图内存时是否可以简单地使用现有 ObservableCollection<IRenderableSeriesViewModel>。我可以再次从 IRenderableSeriesViewModel 中提取 DataSeries,但如果有更快的方法来执行此操作,我会很高兴知道。

谢谢。

编辑:我正在尝试以这种方式进行导出,如知识库中所示。

我的 ViewModel 目前有这个:

private ObservableCollection<IRenderableSeriesViewModel> seriesViewModels =
    new ObservableCollection<IRenderableSeriesViewModel>();

public ObservableCollection<IRenderableSeriesViewModel> SeriesViewModels
{
    get
    {
        return this.seriesViewModels;
    }
}

如知识库中所示,

var series = new FastLineRenderableSeries()
{
    SeriesColor = Colors.Red,
    DataSeries = GetDataSeries()
};

var surface = new SciChartSurface()
{
    ChartTitle = "Rendered In Memory",
    XAxes = xAxes,
    YAxes = yAxes,

    // Here, if I try to use "RenderableSeries = seriesViewModels" it doesn't work.
    RenderableSeries = new ObservableCollection() { series }
};

surface.Width = 1000;
surface.Height = 1000;

// Export to bitmap
var bitmapSource = surface.ExportToBitmapSource();

Visual studio 将显示此错误消息:

Cannot implicitly convert type Cannot implicitly convert type > System.Collections.ObjectModel.ObservableCollection<SciChart.Charting.Model.ChartSeries.IRenderableSeriesViewModel> to System.Collections.ObjectModel.ObservableCollection<SciChart.Charting.Visuals.RenderableSeries.IRenderableSeries>

对于IRenderableSeriesIRenderableSeriesViewModel之间的关系,您有什么建议吗?

根据文档:

为了映射 ObservableCollection<IRenderableSeriesViewModel>SciChartSurface.RenderableSeries which is of type ObservableCollection<IRenderableSeries> you need to use the SeriesBinding 标记扩展。

通常,这在 XAML 中应用如下:

<!-- Declare a SciChartSurface with SeriesBinding -->
<!-- Where xmlns:s="http://schemas.abtsoftware.co.uk/scichart -->
    <s:SciChartSurface RenderableSeries="{s:SeriesBinding RenderableSeriesViewModels}">

    <!-- XAxis, YAxis omitted for brevity -->

</s:SciChartSurface>

所以问题变成了'How to apply a MarkupExtension in code behind',看起来相当困难。

您最好在 XAML 中创建或设计 SciChartSurface 并使用 this.FindResource() to get your style 并将其应用于图表。

编辑:更新

实际上,我可能有适合您的解决方案。 SciChart 有 类 RenderableSeriesConverter and RenderableSeriesSourceCollection。这样的事情可能会奏效:

var surface = new SciChartSurface()
{
    ChartTitle = "Rendered In Memory",
    XAxes = xAxes,
    YAxes = yAxes,

    RenderableSeries = new RenderableSeriesSourceCollection(seriesViewModels);
};

神奇!!