Создание графика WPF C# с Live Chart

84
23 сентября 2019, 04:30

Использую Live Chart. SeriesCollection передает LineSeries в котором Values = ChartValues. В xaml в Binding передаю SeriesCollection. Я так понимаю, что передаются только точки Y (по дефолту ничего не меняю). Как передавать точки X? Пытался в ChartValue по индексу, ругается, что индекс пустой.

GenerateChart.cs:

public ChartValues<double> Points { get; set; }
        double[] arraySeries = new double[30];
        double[] array = new double[20];
        public LineSeries GenerateSeries(string axis)
        {
            Random randomSeries = new Random();
            ChartValues<double> series = new ChartValues<double>(new double[20]);
            if (axis == "Y")
            {
                for (int i = 0; i < 5; i++)
                {
                    double randomValue = randomSeries.Next(1, 20);
                    if (!array.Contains(randomValue))
                    {
                        array[i] = randomValue;
                    }
                    else
                    {
                        i--;
                    }
                }
                for (int i = 0; i < 5; i++)
                {
                    double randomValue = randomSeries.Next(1, 20);
                    if (!arraySeries.Contains(randomValue))
                    {
                        int index = Convert.ToInt32(array[i]);
                        arraySeries[index] = randomValue;
                    }
                    else
                    {
                        i--;
                    }
                }
                for (int i = 0; i < 20; i++)
                {
                    if (arraySeries[i] != 0)
                    {
                        series.Insert(i, arraySeries[i]);
                    }
                }
                //series.AddRange(arraySeries);
            }
            Points = series;
            var testSeries = new LineSeries
            {
                Title = "Test",
                Values = series
            };
            return testSeries;
        }

RandomSeries.cs:

public SeriesCollection Series { get; private set; }
        public SeriesCollection SeriesX { get; private set; }
        public ChartValues<double> Points { get; private set; }
        double[] arraySeries = new double[30];
        double[] array = new double[20];
        public SeriesCollection BuidChart()
        {
            Random randomSeries = new Random();
            var generateChart = new GenerateChart();
            Series = new SeriesCollection 
            {
                generateChart.GenerateSeries("Y")
            };
            Points = generateChart.Points;
            return Series;
        }

ModelView.cs:

public SeriesCollection SeriesCollection { get; set; }
        public ChartValues<double> Points { get; set; }
        public RandomSeries randomSeries;
        public Func<double, string> YFormatter { get; set; }
        public string[] Labels { get; set; }
        public SeriesCollection SeriesCollectionX { get; set; }
        public void BuildFunction()
        {
            //Points.Clear();
            //SeriesCollection.Clear();
            randomSeries = new RandomSeries();
            SeriesCollection = new SeriesCollection();
            Points = new ChartValues<double>();
            SeriesCollection.AddRange(randomSeries.BuidChart());
            //Points.AddRange(randomSeries.Points);
            //SeriesCollection.AddRange(randomSeries.BuidChart());
            //Points.AddRange(randomSeries.Points);
            Labels = new[] { "Jan", "Feb", "Mar", "Apr", "May", "Jan1", "Feb1", "Mar1", "Apr1", "May1" };
        }

MainWindow.xaml:

<Window.DataContext>
        <local:ModelView/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="257*"/>
            <ColumnDefinition Width="536*"/>
        </Grid.ColumnDefinitions>
        <lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Right" Grid.ColumnSpan="2" Margin="0,0,-0.4,0" >
            <!--<lvc:CartesianChart.AxisY>
                <lvc:Axis Title="Y" LabelFormatter="{Binding YFormatter}"></lvc:Axis>
            </lvc:CartesianChart.AxisY>-->
            <lvc:CartesianChart.AxisX>
                <lvc:Axis Title="X" Labels="{Binding Labels}"></lvc:Axis>
            </lvc:CartesianChart.AxisX>
        </lvc:CartesianChart>
    </Grid>

Result program: enter image description here

Answer 1

Вместо ChartValue<double> надо было использовать ChartValues<ObservablePoint>

ChartValues<ObservablePoint> series = new ChartValues<ObservablePoint>();
for (int i = 0; i < 20; i++)
{
    if (arraySeries[i] != 0)
    {
        series.Add(new ObservablePoint(i, arraySeries[i]));
    }
}

(c) Kasper (from https://stackoverflow.com/questions/54587638/create-a-wpf-c-sharp-chart-with-live-chart)

READ ALSO
Unity: выпадающий список переменных в Inspector

Unity: выпадающий список переменных в Inspector

Делаю для игры перевод на разные языкиВ первом скрипте есть публичный класс с публичными переменными

155
Как сделать различные спрайты в массиве UI объектов [закрыт]

Как сделать различные спрайты в массиве UI объектов [закрыт]

Как назначить определенному элементу массива UI объекта (контент в scrollview) соответствующий спрайт из массива спрайта?

88
Как поместить модель в сессию в asp.net?

Как поместить модель в сессию в asp.net?

Модель NewModel приходит на контроллер, нужно ее поместить в сессию:

85
AspNetCore приложение в Docker. как работать с логами?

AspNetCore приложение в Docker. как работать с логами?

Здравствуйте начал искать информацию как вытаскивать обычные текстовые логи из Docker контейнера и ничего не нашелИз этого я сделал вывод что...

103