Рендеринг Visiblox Chart для создания отчетов по сервису без графического интерфейса выдает исключение 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;
}

Теперь я использую это растровое изображение в отчете или что-то еще Это работает.

И тут возникает моя проблема: если я хочу создать свой отчет с изображением диаграммы без графического интерфейса пользователя (в серверном приложении, например, в службе Windows или в IIS), я получаю NullReferenceException из графика.

Что я делаю, так это создаю свой элемент управления, который содержит график. Тогда я звоню Measure() на контроле, чтобы заставить его делать свою работу. Вот где я получаю:

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

Я предполагаю, что должен установить шаблон диаграммы вручную, но где я могу найти шаблоны по умолчанию от VisiBlox? И как их применить? Или есть другая проблема?

Большое спасибо.

--- РЕДАКТИРОВАТЬ ---

Итак, я решил, что если я вызову Measure() для диаграммы VisiBox (или элемента, который содержит диаграмму) в консольном приложении, я всегда получаю это исключение. Поэтому я мог бы также изменить заголовок этого вопроса на Как использовать диаграммы VisiBlox в консольном приложении

1 ответ

Решение

Хорошо, я понял ответ:

1) обернуть вещи Visiblox в

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

сказать это на самом деле сделать.

2) установить данные вручную, а не через DataContext. Это может быть не проводным, если компонент не отображается.

3) установить стиль графика вручную. Значения по умолчанию находятся где-то в файле Visiblox Generic.xaml.

Другие вопросы по тегам