2017-10-25 4 views
0

Ich habe ein kleines Problem. Ich möchte meine Diagramme in ein Bild exportieren. Ich weiß, dass das mit dem Code von beto-rodriguez möglich ist (here).C# Diagramm mit LiveCharts

Aber ich habe ein Problem, ich kann nicht haben, was ich haben könnte, indem Sie es auf dem Bildschirm anzeigen. Siehe das Bild oben. Unten rechts habe ich das Bild in png gespeichert. Und auf der linken Seite des Bildes habe ich das Diagramm mit allen Parametern angezeigt, wo ich will.

Wissen Sie, ob es möglich ist, das gleiche Diagramm (links) im gespeicherten Bild zu haben? Eigentlich verwende ich einen Thread, um das Bild automatisch zu erfassen (kopieren/einfügen).

Wissen Sie, was sind die Parameter, die ich einstellen muss, um das richtige Bild zu haben?

Double chart

Vielen Dank im Voraus. Grüße.

********************************* Nach bearbeiten

Sorry für meine späte repsonse. Ich versuche, was du gesagt hast, aber unzensiert kann ich nicht machen, dass ich will. Ich werde erklären, was ich tue: Ich habe eine Klasse „MakeReport“, die eine andere Klasse „GraphMaker“ mit anrufen:

MyGraph = new GraphMaker(); 
MyGraph = GiveAGraph(MyGraph); 

Und die Klasse „MakeReport“ wird das Diagramm mit einigen Werten mit dem Unter vervollständigen Programm "GiveAGraph()":

GraphData.SeriesCollection.Add(new RowSeries 
    { 
     Title = Criteria, 
     Values = DataValues, 
     ScalesYAt = Index, 
     DataLabels = true 
    }); 

Ende "GiveAGRaph()".

Jetzt habe ich ein Diagramm bereit angezeigt werden, ich will, es benutzen, um ein Bild zu machen und für den Test (und debug) i zeige es:

// Chart to Image 
MyGraph.GiveMeAnImageFromChart();  <-- to make a picture with the chart 
// Show the graph 
MyGraph.Show();      <-- for debug and test, i display it. 

Mit "MyGraph.GiveAnImageFromChart()", i habe nicht das gleiche Ergebnis wie "MyGraph.Show()". Das Bild (Speichern als PNG) unterscheidet sich von dem angezeigten Diagramm.

Das Unterprogramm "GiveAnImageFromChart", die in der "GraphMaker" Klasse ist:

public void GiveMeAnImageFromChart() 
    { 
      var viewbox = new Viewbox(); 
      myChart.Background = Brushes.White; 
      myChart.DataContext = this; 

      // myChart il faut tout mettre en paramètres 

      viewbox.Child = myChart; 
      viewbox.Measure(myChart.RenderSize); 
      viewbox.Arrange(new Rect(new Point(0, 0), myChart.RenderSize)); 

      myChart.Update(true, true); //force chart redraw 
      viewbox.UpdateLayout(); 

      SaveToPng(myChart, "chart.png"); 
      //png file was created at the root directory. 

    } 

Die "myChart" Variable öffentlich ist. Das verwendete Programm "SaveToPng" stammt aus Ihrem Beispiel (here).

das Bild zu speichern, ich versuche mit folgenden Methode:

public System.Drawing.Bitmap ControlToImage(Visual target, double dpiX, double dpiY) 
    { 
     if (target == null) 
     { 
      return null; 
     } 
     // render control content 
     Rect bounds = VisualTreeHelper.GetDescendantBounds(target); 
     Console.WriteLine("Bounds width = " + bounds.Width + " et bounds height = " + bounds.Height); 
     RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX/96.0), 
                 (int)(bounds.Height * dpiY/96.0), 
                 dpiX, 
                 dpiY, 
                 PixelFormats.Pbgra32); 
     DrawingVisual dv = new DrawingVisual(); 
     using (DrawingContext ctx = dv.RenderOpen()) 
     { 
      VisualBrush vb = new VisualBrush(target); 
      ctx.DrawRectangle(vb, null, new Rect(new System.Windows.Point(), bounds.Size)); 
     } 
     rtb.Render(dv); 

     //convert image format 
     MemoryStream stream = new MemoryStream(); 
     BitmapEncoder encoder = new BmpBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(rtb)); 
     encoder.Save(stream); 

     return new System.Drawing.Bitmap(stream); 
    } 

mit:

Bitmap ImageChart = MyGraph.ControlToImage(MyGraph, MyGraph.Width, MyGraph.Height); 

Mit dieser Methode, ich habe einen Fehler, da die "bounds.Width" und „Grenzen .Höhe "sind gleich -8. Und schließlich habe ich kein Diagramm zum Konvertieren.

Ich denke, ich gebe ein falsches "visual Target" in der "ControlImage" und ich vermisse etwas, aber ich weiß nicht was. Wenn Sie weitere Informationen benötigen, fragen Sie mich. Vielen Dank im Voraus für Ihre Hilfe.

PS: Entschuldigung für mein Englisch. Zögere nicht, mich zu korrigieren.

Antwort

0

dank BTO-RDZ, machte ich eine Lösung . Ich habe festgestellt, dass ich Livecharts nicht korrekt verwendet habe. Also poste ich meinen Code, wenn jemand es braucht.

Das ist mein GraphMaker.xaml Datei:

<UserControl x:Class="MyProject.GraphMaker" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:MyProject" 
     mc:Ignorable="d" 
     d:DesignHeight="730" d:DesignWidth="1660"> 
<Grid> 
</Grid> 
</UserControl> 

Und meine GraphMaker.xaml.cs Datei

using System; 
using System.IO; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using LiveCharts; 
using LiveCharts.Wpf; 
using System.Collections.Generic; 
using System.ComponentModel; 


namespace MyProject 
{  
    public partial class GraphMaker : UserControl 
    { 
     // PUBLIC 
     public CartesianChart MyTestChart; 
     public SeriesCollection MySeriesCollection { get; set; } 
     public string[] Labels { get; set; } 
     public string AxisTitle { get; set; } 
     public Func<double, string> YFormatter { get; set; } 
     public Axis Axis1, Axis2, Axis3, Axis4, Axis5, Axis6, Axis7, Axis8, Axis9, Axis10, AxisXChart; 


     public GraphMaker() 
     { 
      InitializeComponent(); 
      MySeriesCollection = new SeriesCollection(); 

      MyTestChart = new CartesianChart 
      { 
       DisableAnimations = true, 
       Width = 1600, 
       Height = 700, 
       Series = MySeriesCollection 
      }; 

      MyTestChart.LegendLocation = LegendLocation.Right; 

      // *** Axis 1 *** 
      Axis1 = new Axis(); 
      Axis1.Foreground = Brushes.DodgerBlue; 
      Axis1.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis1.LabelFormatter = YFormatter; 
      MyTestChart.AxisY.Add(Axis1); 

      // *** Axis 2 *** 
      Axis2 = new Axis(); 
      Axis2.Foreground = Brushes.IndianRed; 
      Axis2.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis2.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis2); 

      // *** Axis 3 *** 
      Axis3 = new Axis(); 
      Axis3.Foreground = Brushes.Gold; 
      Axis3.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis3.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis3); 

      // *** Axis 4 *** 
      Axis4 = new Axis(); 
      Axis4.Foreground = Brushes.Gray; 
      Axis4.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis4.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis4); 

      // *** Axis 5 *** 
      Axis5 = new Axis(); 
      Axis5.Foreground = Brushes.DeepSkyBlue; 
      Axis5.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis5.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis5); 

      // *** Axis 6 *** 
      Axis6 = new Axis(); 
      Axis6.Foreground = Brushes.HotPink; 
      Axis6.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis6.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis6); 

      // *** Axis 7 *** 
      Axis7 = new Axis(); 
      Axis7.Foreground = Brushes.Orange; 
      Axis7.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis7.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis7); 

      // *** Axis 8 *** 
      Axis8 = new Axis(); 
      Axis8.Foreground = Brushes.RoyalBlue; 
      Axis8.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis8.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis8); 

      // *** Axis 9 *** 
      Axis9 = new Axis(); 
      Axis9.Foreground = Brushes.Black; 
      Axis9.Position = AxisPosition.RightTop; 
      Axis9.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis9); 

      // *** Axis 10 *** 
      Axis10 = new Axis(); 
      Axis10.Foreground = Brushes.DarkTurquoise; 
      Axis10.Position = AxisPosition.RightTop; 
      YFormatter = value => value.ToString("N2"); 
      Axis10.LabelFormatter = YFormatter; 
      //MyTestChart.AxisY.Add(Axis10); 

      AxisXChart = new Axis(); 
      AxisXChart.Title = AxisTitle; 
      AxisXChart.Labels = Labels; 
     } 


     public void TakeTheChart() 
     { 
      var viewbox = new Viewbox(); 
      viewbox.Child = MyTestChart; 
      viewbox.Measure(MyTestChart.RenderSize); 
      viewbox.Arrange(new Rect(new Point(0, 0), MyTestChart.RenderSize)); 
      MyTestChart.Update(true, true); //force chart redraw 
      viewbox.UpdateLayout(); 

      SaveToPng(MyTestChart, "Chart.png"); 
      //png file was created at the root directory. 
     } 

     public void SaveToPng(FrameworkElement visual, string fileName) 
     { 
      var encoder = new PngBitmapEncoder(); 
      EncodeVisual(visual, fileName, encoder); 
     } 

     private static void EncodeVisual(FrameworkElement visual, string fileName, BitmapEncoder encoder) 
     { 
      var bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32); 
      bitmap.Render(visual); 
      var frame = BitmapFrame.Create(bitmap); 
      encoder.Frames.Add(frame); 
      using (var stream = File.Create(fileName)) encoder.Save(stream); 
     } 
    } 
} 

Hoffnung, Ihnen zu helfen.

Einen schönen Tag noch. Tschüss.

0

Das Beispiel, auf das Sie verwiesen haben, wird eine neue Diagramminstanz im Speicher erstellt, deshalb erhalten Sie ein anderes Bild, Sie könnten dieselben Eigenschaften in beiden Diagrammen reproduzieren, das auf der Benutzeroberfläche und dasjenige, das Sie darstellen im Speicher erstellen, oder Sie können die die aktuelle Instanz in der Benutzeroberfläche nur drucken, wie in dieser Ausgabe erklärt:

https://github.com/beto-rodriguez/Live-Charts/issues/243

Hoffnung hilft es

Verwandte Themen