2011-09-27 26 views
6

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:. chart

Trong khi lớn, không hữu ích vì nó không có biểu đồ nào.

+0

Cập nhật với tiến độ – Technicolour

Trả lời

1
+0

Cảm ơn, thật không may là bao gồm tất cả những thứ tương tự mà tôi đã đọc ở khắp mọi nơi khác mà chỉ là chi tiết làm thế nào để xuất khẩu các yếu tố như kích thước mà nó hiện đang được hiển thị, nơi tôi muốn có thể chỉ định kích thước để tôi có thể cung cấp điều khiển đó cho người dùng (tức là muốn xuất biểu đồ lớn cho bản trình bày) – Technicolour

2
RenderTargetBitmap DrawToImage<T>(T source, double scale) where T:FrameworkElement 
{ 
    var clone = Clone(source); 
    clone.Width = clone.Height = Double.NaN; 
    clone.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
    clone.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
    clone.Margin = new Thickness(); 
    var size = new Size(source.ActualWidth * scale, source.ActualHeight * scale); 
    clone.Measure(size); 
    clone.Arrange(new Rect(size)); 

    var renderBitmap = new RenderTargetBitmap((int)clone.ActualWidth, (int)clone.ActualHeight, 96, 96, PixelFormats.Pbgra32); 
    renderBitmap.Render(clone); 
    return renderBitmap; 
} 

static T Clone<T>(T source) where T:UIElement 
{ 
    if (source == null) 
     return null; 
    string xaml = XamlWriter.Save(source); 
    var reader = new StringReader(xaml); 
    var xmlReader = XmlTextReader.Create(reader, new XmlReaderSettings()); 
    return (T)XamlReader.Load(xmlReader); 
} 
+0

Cảm ơn sự giúp đỡ, tiếc là việc nối tiếp chuỗi và trả lại trong phương thức sao chép hoặc không ' t làm việc hoặc nó chỉ đơn giản là mất một thời gian rất dài (tôi đang đối phó với ~ 50k + điểm) – Technicolour

Các vấn đề liên quan