在没有图形 UI 的情况下呈现 Visiblox 图表以报告服务会引发 NullReferenceException



我有一个非常简单的Visiblox图表,工作正常:

<charts:Chart Grid.Row="1" Height="100" x:Name="VisiChart">
    <charts:Chart.Series>
        <charts:LineSeries/>
    </charts:Chart.Series>
</charts:Chart>

我在代码隐藏中设置了DataSeries

VisiChart.Series[0].DataSeries = MyDataSeries;

就这么简单。

我可以使用此方法从可视元素中获取位图:

private static RenderTargetBitmap AsBmpToClipboard(FrameworkElement element)
{
    var width = (int)Math.Round(element.ActualWidth);
    var height = (int)Math.Round(element.ActualHeight);
    var bmpCopied = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
    var dv = new DrawingVisual();
    using (var dc = dv.RenderOpen())
    {
        var vb = new VisualBrush(element);
        dc.DrawRectangle(vb, null, new Rect(new Point(), new Size(width, height)));
    }
    bmpCopied.Render(dv);
    Clipboard.SetImage(bmpCopied); // clipboard it for testing reasons
    return bmpCopied;
}

现在我在报表或其他任何东西中使用此位图。这行得通。

我的问题来了:如果我想在没有GUI的情况下使用图表图像创建报告(在服务器应用程序中,例如Windows服务或IIS),我会从图表中获得NullReferenceException

我所做的是创建包含图表的控件。然后,我在控件上调用Measure()以使其正常工作。这就是我得到的地方:

NullReferenceException
at Visiblox.Charts.Chart.OnApplyTemplateInternal()
   at Visiblox.Charts.ChartBase.OnApplyTemplate()
   at System.Windows.FrameworkElement.ApplyTemplate()

我想我必须手动设置图表的模板,但是在哪里可以找到 VisiBlox 的默认模板?我该如何应用它们?还是有其他问题?

非常感谢。

---编辑---

所以,我想如果我在控制台应用程序中的 VisiBox 图表(或包含图表的元素)上调用 Measure(),我总是得到这个异常。所以我也可以把这个问题的标题改成如何在控制台应用程序中使用 VisiBlox 图表

好的,我想出了答案:

1)将Visiblox的东西包裹起来

InvalidationHandler.ForceImmediateInvalidate = true;
// here comes the chart
InvalidationHandler.ForceImmediateInvalidate = false;

告诉它实际渲染。

2) 手动设置数据,而不是通过数据上下文。如果未显示组件,则可能未连接。

3) 手动设置图表的样式。默认值位于 Visiblox Generic.xaml 文件中的某个位置。

相关内容

  • 没有找到相关文章

最新更新