私はユーザーに表示しているチャートを持っています。チャートをディスクにイメージとしてエクスポートして、アプリケーション(プレゼンテーションなど)。UIElementのイメージを画面に表示されたものよりも大きくレンダリングしました
私はPngBitmapEncoderとRenderTargetBitmapを使って基本的な考え方を手に入れましたが、私がそこから抜け出すイメージは、実際に使用するには小さかったので、はるかに大きなイメージを得たいと思います。
レンダリングしたいコントロールの高さと幅を単純に大きくしようとしましたが、親がレンダーサイズを直接制御しているようです。これから、UIElementをメモリに複製しようとしましたが、レンダリングサイズは(0,0)でした.Array()や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