gpt4 book ai didi

c# - 保存呈现的 UIElement 图像大于它在屏幕上显示的图像

转载 作者:太空狗 更新时间:2023-10-29 21:35:57 25 4
gpt4 key购买 nike

我有一个要显示给用户的图表,我希望能够将该图表作为图像导出到磁盘,以便他们可以在应用程序之外使用它(用于演示或其他用途)。

我已经设法通过使用 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);
}
}

所以我得到了这样的东西: chart

虽然很大,但没有用,因为它没有任何图表。

最佳答案

http://www.visiblox.com/blog/2011/05/printing-visiblox-charts

我遗漏的要点是

InvalidationHandler.ForceImmediateInvalidate = true;

在我在内存中渲染图表之前设置它,然后在我完成后恢复它。从那里开始一帆风顺:D

关于c# - 保存呈现的 UIElement 图像大于它在屏幕上显示的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com