c# - 如何在 WPF 中动态导出图表?

标签 c# .net wpf winforms charts

我正致力于动态生成图表,然后将其保存到图像文件(不必在 UI 中显示)。这是我的 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 中显式创建具有特定宽度和高度等的静态图表并将其导出到文件中。有人可以帮忙吗?

最佳答案

在渲染之前尝试测量和安排控件:

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;
}

关于c# - 如何在 WPF 中动态导出图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171094/

相关文章:

c# - 在 .NET 中将 List<object> 序列化为 XML 时如何重命名根节点?

c# - 获取xml文档中元素数量的快速方法

c# - C# 中的填充无效且无法删除

c# - Null in String.Format args 抛出 NullReferenceException 即使 arg 不在结果字符串中

c# - 在 WPF 应用程序中使用服务定位器模式时的 View 模型范围

c# - WPF – 集合内容属性

c# - 事件 "While Button is Pressed"

c# - Entity Framework 4(关联配置过滤器)

c# - Windows 8 上的文件历史记录

c# - 如何将现有屏幕添加到 Sketchflow map ?