Не удалось захватить живую диаграмму WPF в растровом изображении

Я пытаюсь написать функцию, которая будет записывать результаты теста (которые имеют как текстовый вывод, так и вывод диаграммы, хранящиеся в текстовом поле и диаграмме livecharts соответственно) в файл pdf. С выводом текста проблем нет, но мне не удалось сохранить диаграммы, если я не извлекаю каждую диаграмму из родительской панели стека (у каждого теста есть панель стека, которая отображается при выборе теста), а затем отображаю график в отдельном окне. Вокруг проблемных строк много кода, поэтому ниже я вставлю сокращенную версию.

Проблема, похоже, вызывает _saveWindow.Show() вместо .ShowDialog. Мне нужно, чтобы это открывалось и закрывалось без ввода пользователя, но Show() вообще не рисует диаграмму в окне.

Есть идеи, почему это происходит?

foreach (TestSequenceItem tsi in resultsToSave)
{
     tsi.Instances[0].ChartStackPanel.Visibility = Visibility.Visible;

     for (int i=0; i<tsi.Instances[0].StackChartList.Count; i++)
     {
          Chart _saveChart = tsi.Instances[0].StackChartList[i];
          tsi.Instances[0].ChartStackPanel.Children.Remove(_saveChart);

          ScrollViewer panel = new ScrollViewer { Content = _saveChart };
          Window _saveWindow = new Window { Content = panel };

          _saveWindow.Show();

          var encoder = new PngBitmapEncoder();
          RenderTargetBitmap bmp = new RenderTargetBitmap((int)tsiChartDoc.DefaultPageSetup.PageWidth, 600, 96, 96, PixelFormats.Pbgra32);
          bmp.Render(_saveChart);
          encoder.Frames.Add(BitmapFrame.Create(bmp));

          using (MemoryStream stm = new MemoryStream())
          {
               encoder.Save(stm);

               string fileName = "base64:" + Convert.ToBase64String(stm.ToArray());

               // Adding a heading to the pdf
               tsiChartDoc.LastSection.AddParagraph(tsi.Instances[0].StackTitleList[i].Text, "Heading2");

               tsiChartDoc.LastSection.AddImage(fileName);
          }

          _saveWindow.Close();
          panel.Content = null;
                            
          tsi.Instances[0].ChartStackPanel.Children.Insert(chartIdx, _saveChart);
     }
}

person John Snow    schedule 13.07.2021    source источник
comment
Непонятно, зачем вам вообще Окно. Обычно вы берете элемент пользовательского интерфейса, такой как Chart, вызываете его методы Measure и Arrange (и, возможно, InvalidateVisual), а затем передаете его в RenderTargetBitmap.Render. Если элемент имеет некоторое поле, вы также можете использовать промежуточный объект DrawingVisual. См., например, это и это .   -  person Clemens    schedule 14.07.2021
comment
Я не уверен, зачем нужно это окно, но даже вызов недействительного визуального элемента на самом деле не показывает диаграмму. Сохраняются только те графики, которые в данный момент видны на экране (без окна). Итак, если есть 2 набора диаграмм, сохраняются только набор 1, диаграмма 1 и т. д.... верхние 10% набора 1, диаграмма 2.   -  person John Snow    schedule 14.07.2021