У меня есть диаграмма, которую я показываю пользователю, и я хочу иметь возможность экспортировать диаграмму в виде изображения на диск, чтобы они могли использовать ее вне приложения (для презентации или чего-то еще).
Мне удалось реализовать основную идею, используя PngBitmapEncoder и RenderTargetBitmap, но изображение, которое я получаю, очень маленькое, чтобы его можно было реально использовать, и я хочу получить намного большее изображение.
Iпопытался просто увеличить высоту и ширину элемента управления, который я хотел визуализировать, но родительский элемент, похоже, имеет прямой контроль над размером визуализации.Из этого я попытался продублировать UIElement в памяти, но затем размер рендеринга был (0,0), и когда я попытался использовать методы для его рендеринга, такие как Measure () Arrange () и UpdateLayout (), они выдают исключения онужно разъединить родительский элемент для вызова этого, но так как он находится в памяти и не отображается, не должно быть родительского элемента?
Все это делается с помощью API-графиков Visiblox
Вот что ямы получили в настоящее время, за исключением того, что это не работает: (
var width = 1600;
var height = 1200;
var newChart = new Chart { Width = width, Height = height, Title = chart.Title, XAxis = chart.XAxis, YAxis = chart.YAxis, Series = chart.Series};
Debug.WriteLine(newChart.RenderSize);
var size = new Size(width, height);
newChart.Measure(size);
newChart.Arrange(new Rect(size));
newChart.UpdateLayout();
Debug.WriteLine(newChart.RenderSize);
var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
rtb.Render(newChart);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
using (var stream = fileDialog.OpenFile())
encoder.Save(stream);
Я стал немного ближе, теперь он отображает фон графика как ось 'и т. д., но только не реальные линии, которые отображаютсяНиже приведен обновленный источник
public static void RenderChartToImage(Chart elementToRender, string filename)
{
if (elementToRender == null)
return;
Debug.Write(elementToRender.RenderSize);
var clone = new Chart();
clone.Width = clone.Height = double.NaN;
clone.HorizontalAlignment = HorizontalAlignment.Stretch;
clone.VerticalAlignment = VerticalAlignment.Stretch;
clone.Margin = new Thickness();
clone.Title = elementToRender.Title;
clone.XAxis = new DateTimeAxis();
clone.YAxis = new LinearAxis() { Range = Range<double>)elementToRender.YAxis.Range};
foreach (var series in elementToRender.Series)
{
var lineSeries = new LineSeries
{
LineStroke = (series as LineSeries).LineStroke,
DataSeries = series.DataSeries
};
clone.Series.Add(lineSeries);
}
var size = new Size(1600, 1200);
clone.Measure(size);
clone.Arrange(new Rect(size));
clone.UpdateLayout();
Debug.Write(clone.RenderSize);
var height = (int)clone.ActualHeight;
var width = (int)clone.ActualWidth;
var renderer = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Pbgra32);
renderer.Render(clone);
var pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(BitmapFrame.Create(renderer));
using (var file = File.Create(filename))
{
pngEncoder.Save(file);
}
}
Итак, я получаю что-то вроде этого:
Что, хотя и большое, бесполезно, поскольку в нем ничего не обозначено.