Экспорт графики с использованием InteractiveDataDisplay.WPF - PullRequest
0 голосов
/ 17 мая 2018

Я использую компонент InteractiveDataDisplay.WPF для создания графики, и все идет хорошо, но когда я пытаюсь экспортировать графику в изображение, серия не экспортируется должным образом с графикой.

Следуйте моему коду и изображениям:

<Grid Name="LayoutRoot" Background="White">
    <Grid Name="Grafico">
        <d3:Chart Name="plotter">
            <Grid Name="lines"/>
        </d3:Chart>
    </Grid>
</Grid>

public MainWindow()
    {
        InitializeComponent();

        double[] x = new double[200];
        for (int i = 0; i < x.Length; i++)
            x[i] = 3.1415 * i / (x.Length - 1);

        for (int i = 0; i < 25; i++)
        {
            var lg = new LineGraph();
            lines.Children.Add(lg);
            lg.Stroke = new SolidColorBrush(Color.FromArgb(255, 0, (byte)(i * 10), 0));
            lg.Description = String.Format("Data series {0}", i + 1);
            lg.StrokeThickness = 2;
            lg.Plot(x, x.Select(v => Math.Sin(v + i / 10.0)).ToArray());
        }

        int width = 800;
        int heigth = 600;

        Chart Bmain_Chart = new Chart();
        Bmain_Chart.Measure(new Size(width, heigth));
        Bmain_Chart.Arrange(new Rect(new Size(width, heigth)));
        Bmain_Chart.LeftTitle = "Bmain";
        Bmain_Chart.BottomTitle = "Time";
        Bmain_Chart.Content = lines;
        Bmain_Chart.UpdateLayout();

        RenderTargetBitmap bmp = new RenderTargetBitmap(width, heigth, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(Bmain_Chart);

        var encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmp));

        using (Stream stm = File.Create(@"c:\MyCustomPath\test.png")) { encoder.Save(stm); }
    }

Правильная графика

Correct Graphic

Экспортированная графика

Exported Graphic

Если кто-нибудь может мне помочь, я буду вечно благодарен.

1 Ответ

0 голосов
/ 12 октября 2018

В текущей версии IDD многие компоненты IDD зависят от события OnLoaded.Таким образом, вам нужно поместить диаграмму где-нибудь в окне, чтобы правильно инициализировать ее.

Для решения этой проблемы есть обходной путь.

Вы должны выполнить рендеринг в bmp после загрузки неактивных компонентов.Итак, следующий код работает нормально:

public partial class MainWindow : Window
{
    protected override void OnContentRendered(EventArgs e)
    {

        double width = 800;
        double heigth = 600;

        RenderTargetBitmap bmp = new RenderTargetBitmap((int)width, (int)heigth, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(plotter);

        var encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmp));

        using (Stream stm = File.Create(@"c:\MyCustomPath\test.png")) { encoder.Save(stm); }
    }

    public MainWindow()
    {
        InitializeComponent();

        double[] x = new double[200];
        for (int i = 0; i < x.Length; i++)
            x[i] = 3.1415 * i / (x.Length - 1);

        for (int i = 0; i < 25; i++)
        {
            var lg = new LineGraph();
            lines.Children.Add(lg);
            lg.Stroke = new SolidColorBrush(Color.FromArgb(255, 0, (byte)(i * 10), 0));
            lg.Description = String.Format("Data series {0}", i + 1);
            lg.StrokeThickness = 2;
            lg.Plot(x, x.Select(v => Math.Sin(v + i / 10.0)).ToArray());
        }
    }
}

Если вам действительно не нужно показывать свои компоненты пользователю, вы можете добавить this.Hide(); в конструктор окна.В противном случае вы можете добавить код рендеринга в обработчик некоторых кнопок OnClick.

...