我有一個圖表顯示給用戶,我希望能夠將圖表作爲圖像導出到磁盤,以便他們可以在應用程序(用於演示文稿或其他內容)。保存呈現比屏幕上顯示的大的UIElement的圖像
我設法得到了使用PngBitmapEncoder和RenderTargetBitmap的基本思想,但我從中得到的圖像是小到真正可用的圖像,我希望獲得更大的圖像。
我試圖簡單地增加我想渲染的控件的高度和寬度,但父級似乎直接控制渲染大小。從這裏我嘗試在內存中複製UIElement,但是渲染大小是(0,0),當我嘗試使用方法來渲染它時,例如Measure()Arrange()和UpdateLayout(),它們會拋出異常需要解耦父對象來調用這些對象,但是因爲它在內存中並且不會被渲染,所以不應該有父對象?
這是所有Visiblox圖表API來完成
以下是我已經有了目前,只是它不工作:(
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);
}
}
於是我走出這樣的:。
哪個大,沒有用,因爲它沒有任何圖表。
更新與進展 – Technicolour