2017-09-12 22 views
2

私は動的にグラフを生成し、それを画像ファイルに保存しています(UIに表示する必要はありません)。WPFコードのグラフのコードは次のとおりです。WPFでグラフを動的に書き出す方法は?

<chart:PieChart 
       Name="chart1" 
       Style="{StaticResource MinimalChartStyle}" 
       ChartTitle="Minimal Pie Chart" 
       ChartSubTitle="Chart with fixed width and height" 
       SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}" Height="Auto" Width="Auto" > 
      <chart:PieChart.Series> 
       <chart:ChartSeries 
         SeriesTitle="Errors" 
         DisplayMember="Category" 
         ValueMember="Number" 
         ItemsSource="{Binding Path=Errors}" /> 
      </chart:PieChart.Series> 
     </chart:PieChart> 

.csコードのように。

public ObservableCollection<TestClass> Errors { get; private set; } 

public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = this; 

     Errors = new ObservableCollection<TestClass>(); 
     Errors.Add(new TestClass() { Category = "Globalization", Number = 75 }); 
     Errors.Add(new TestClass() { Category = "Features", Number = 2 }); 
     Errors.Add(new TestClass() { Category = "ContentTypes", Number = 12 }); 
     Errors.Add(new TestClass() { Category = "Correctness", Number = 83 }); 
     Errors.Add(new TestClass() { Category = "Best Practices", Number = 29 }); 

    } 

と私は何をしようとしていますが、上記のようなグラフを作成し、さらに参考のためにファイルに保存することができた以下のような方法です。

public bool buildChart() { 

     ClusteredBarChart newchart = new ClusteredBarChart(); 

     //newchart.ActualWidth = 500; inaccessible 
     //newchart.ActualHeight = 400; 
     // T.B.D 
     ... 
     ... 
     newchart.DataContext = Errors; 

     saveTheChartToFile(newchart); 

     return true; 
    } 

    public bool saveTheChartToFile(ChartBase view) 
    { 
     Size size = new Size(view.ActualWidth, view.ActualHeight); 

     if (size.IsEmpty) 
      return false; 

     RenderTargetBitmap result = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32); 

     DrawingVisual drawingvisual = new DrawingVisual(); 

     using (DrawingContext context = drawingvisual.RenderOpen()) 
     { 
      context.DrawRectangle(new VisualBrush(view), null, new Rect(new Point(), size)); 
      context.Close(); 
     } 

     result.Render(drawingvisual); 

     BitmapEncoder encoder = new JpegBitmapEncoder(); 

     MemoryStream file = new MemoryStream(); 

     encoder.Frames.Add(BitmapFrame.Create(result)); 

     encoder.Save(file); 

     System.IO.File.WriteAllBytes("d:\\ppp.jpeg", file.ToArray()); 

     return true; 
    } 

あなたが明示的に特定の幅と高さをXAMLで静的なグラフを作成し、その上で使用する前に、ファイルにエクスポートする必要があることと思われます。助けてもらえますか?

答えて

0

は、あなたがそれをレンダリングする前にコントロールを測定し、手配してください:

public bool saveTheChartToFile(ChartBase view) 
{ 
    Size size = new Size(100, 100); 

    RenderTargetBitmap result = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32); 
    view.Measure(size); 
    view.Arrange(new Rect(size)); 

    result.Render(view); 


    BitmapEncoder encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(result)); 
    using (Stream stm = File.Create("test.jpg")) 
    { 
     encoder.Save(stm); 
    } 

    return true; 
} 
+0

動作するようには思えません。そして出力は黒です – Rich

+0

私の編集された答えでコードを試してください。 – mm8

+0

こんにちはmm8、ありがとう。このコードは、静的なチャートをファイルに保存するのに最適です。しかし、実際には、私が望んでいたのは、プログラムでグラフを作成して保存することでした。私が使用するWPFチャートコンポーネント(wpfのMetro UI)では、スタティックチャートの可視性を「折りたたみ」または「非表示」に変更しても動作しません。 – Rich

関連する問題