【问题标题】:Rendering chart to bitmap in memory from IRenderableSeriesViewModel从 IRenderableSeriesViewModel 将图表渲染到内存中的位图
【发布时间】:2016-08-19 21:15:35
【问题描述】:

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

当我尝试遵循SciChart Knowledgebase 的指南时,它使用FastLineRenderableSeries 作为RenderableSeries,当我尝试将我预先存在的ObservableCollection<IRenderableSeriesViewModel> 分配给@ 下的RenderableSeries 属性时它不起作用987654329@。

我想知道当我尝试将现有的绘图导出到位图内存时,是否可以简单地使用现有的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 将显示此错误消息:

不能隐式转换类型不能隐式转换类型> System.Collections.ObjectModel.ObservableCollection&lt;SciChart.Charting.Model.ChartSeries.IRenderableSeriesViewModel&gt; 到 System.Collections.ObjectModel.ObservableCollection&lt;SciChart.Charting.Visuals.RenderableSeries.IRenderableSeries&gt;

你对IRenderableSeriesIRenderableSeriesViewModel之间的关系有什么建议吗?

【问题讨论】:

  • 嗨,Kurtis,您使用的是 SciChartSurface.ExportToBitmapSource() 吗?这适用于绑定到 ObservableCollection 吗?愿意分享一个代码示例吗?请在此处编辑您的问题 + 评论以通知我
  • 谢谢 ABT 博士。我已经用我正在尝试使用的代码更新了我的问题。

标签: scichart


【解决方案1】:

根据文档:

为了在ObservableCollection&lt;IRenderableSeriesViewModel&gt;SciChartSurface.RenderableSeries 之间进行映射,ObservableCollection&lt;IRenderableSeries&gt; 类型您需要使用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 有 RenderableSeriesConverterRenderableSeriesSourceCollection 类。这样的事情可能会起作用:

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

    RenderableSeries = new RenderableSeriesSourceCollection(seriesViewModels);
};

魔法!!

【讨论】:

  • 知道了。我想我会采用从 IRenderableSeriesViewModel 中提取 DataSeries 并重建新的 IRenderableSeries 的方法。
  • 其实我可能有一个解决方案给你。查看我的更新答案
  • 谢谢。您更新后的答案与我现有的收藏完美搭配。
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多