Tôi có biểu đồ mà tôi đang hiển thị cho người dùng và tôi muốn có thể xuất biểu đồ dưới dạng hình ảnh vào đĩa để họ có thể sử dụng nó bên ngoài các ứng dụng (cho một bài thuyết trình hoặc một cái gì đó).Lưu hình ảnh của một UIElement được hiển thị lớn hơn xuất hiện trên màn hình
Tôi đã xoay xở để có được ý tưởng cơ bản khi sử dụng PngBitmapEncoder và RenderTargetBitmap nhưng hình ảnh tôi nhận được là cách nhỏ để thực sự có thể sử dụng được và tôi muốn có một hình ảnh lớn hơn nhiều.
Tôi đã cố gắng đơn giản tăng Chiều cao và Chiều rộng của điều khiển mà tôi muốn hiển thị, nhưng phụ huynh dường như có quyền kiểm soát trực tiếp trên kích thước hiển thị. Từ đây tôi đã cố gắng nhân đôi UIElement trong bộ nhớ nhưng sau đó kích thước render là (0,0) và khi tôi cố gắng sử dụng các phương thức để làm cho nó hiển thị, chẳng hạn như Measure() Arrange() và UpdateLayout() chúng ném các ngoại lệ về cần phải tách riêng cha mẹ để gọi những cái này, nhưng vì nó nằm trong bộ nhớ và không được hiển thị nên không có cha mẹ?
này được thực hiện với tất cả Visiblox biểu đồ API
Dưới đây là những gì tôi đã hiện có, ngoại trừ nó không hoạt động :(
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);
Tôi đã nhận được một chút gần hơn, nó bây giờ làm cho nền đồ thị trục vv nhưng chỉ không phải là dòng thực tế đang được vẽ đồ thị Dưới đây là một nguồn cập nhật
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);
}
}
Vì vậy, tôi nhận ra một cái gì đó như thế này:.
Trong khi lớn, không hữu ích vì nó không có biểu đồ nào.
Cập nhật với tiến độ – Technicolour