Сохранение изображения UIElement, отображаемого больше, чем оно отображается на экране

У меня есть диаграмма, которую я показываю пользователю, и я хочу иметь возможность экспортировать диаграмму как изображение на диск, чтобы они могли использовать ее вне приложения (для презентации или что-нибудь).

Мне удалось получить основную идею работы с использованием PngBitmapEncoder и RenderTargetBitmap, но изображение, которое я получаю, слишком мало, чтобы его действительно можно было использовать, и я хочу получить изображение гораздо большего размера.

Я попытался просто увеличить высоту и ширину элемента управления, который я хотел визуализировать, но похоже, что родитель имеет прямой контроль над размером визуализации. Исходя из этого, я попытался продублировать 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);
    }
}

Итак, я получаю получается что-то вроде этого: chart

Которая хоть и большая, но бесполезная, поскольку в ней ничего не отображается.

6
задан Dave Clemmer 6 September 2013 в 22:30
поделиться