Рендеринг 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.