Несколько осей во время выполнения в LiveCharts - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь написать приложение WPF для построения линейных диаграмм для серий чисел, которые у меня есть. Эти числа перечислены в файле .CSV, который я прочитаю во время выполнения. Таким образом, я не знаю ни количества серий, которые я буду иметь, ни значений max / min каждой.

Чтобы продемонстрировать и для краткости, взгляните на следующий пример. Думайте об этих значениях ряда как о том, что я прочитаю из моего .CSV файла в моем реальном приложении.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        SeriesCollection = new SeriesCollection
        {
            new LineSeries
            {
                Title = "Series 1",
                Values = new ChartValues<double> { 4, 66, 5, 2, 4 },
            },
            new LineSeries
            {
                Title = "Series 2",
                Values = new ChartValues<double> { 6, 7, 3, 4, 6 },
            },
            new LineSeries
            {
                Title = "Series 3",
                Values = new ChartValues<double> { 4, 2, 7, 2, 7 },
            }
        };

        DataContext = this;
    }

    public SeriesCollection SeriesCollection { get; set; }
}

Мой XAML выглядит очень просто, вот так:

<Window x:Class="WPFCharts.MainWindow"
        ...
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <lvc:CartesianChart Series="{Binding SeriesCollection}"/>
    </Grid>
</Window>

Как вы можете видеть, одно из значений в одной серии находится вне графиков по сравнению с остальными, если бы я построил это на линейном графике с настройками по умолчанию LiveCharts:

enter image description here

Поэтому я хочу дать пользователю возможность размещать такие линейные графики на своей оси. Читая LiveCharts документацию, я обнаружил, , как показано здесь , что вы можете поместить различные серии линий в разные оси, используя свойства ScaleXAt и ScaleYAt.

Однако этот пример устанавливает ось в XAML, тогда как я хочу сделать это динамически. Поэтому я попытался установить указанное свойство в коде так:

SeriesCollection = new SeriesCollection
{
    new LineSeries
    {
        Title = "Series 1",
        Values = new ChartValues<double> { 4, 66, 5, 2, 4 },
        ScalesYAt = 0
    },
    new LineSeries
    {
        Title = "Series 2",
        Values = new ChartValues<double> { 6, 7, 3, 4, 6 },
        ScalesYAt = 1
    },
    new LineSeries
    {
        Title = "Series 3",
        Values = new ChartValues<double> { 4, 2, 7, 2, 7 },
        ScalesYAt = 2
    }
};

Но когда я делаю это и запускаю приложение, я получаю исключение:

System.ArgumentOutOfRangeException: 'Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. '

Что я здесь не так делаю? Как я могу установить это, используя код, а не XAML?

1 Ответ

2 голосов
/ 08 апреля 2019

Если вы хотите использовать разные оси Y, вам нужно объявить их, может быть, вы пропустили это.Таким образом, ваша модель станет примерно такой:

public class ViewModel
{
    public ViewModel()
    {
        SeriesCollection = new SeriesCollection
        {
            new LineSeries
            {
                Title = "Series 1",
                Values = new ChartValues<double> { 4, 66, 5, 2, 4 },
                ScalesYAt = 0
            },
            new LineSeries
            {
                Title = "Series 2",
                Values = new ChartValues<double> { 6, 7, 3, 4, 6 },
                ScalesYAt = 1
            },
            new LineSeries
            {
                Title = "Series 3",
                Values = new ChartValues<double> { 4, 2, 7, 2, 7 },
                ScalesYAt = 2
            }
        };

        AxisYCollection = new AxesCollection
        {
            new Axis { Title = "Y Axis 1", Foreground = Brushes.Gray },
            new Axis { Title = "Y Axis 2", Foreground = Brushes.Red },
            new Axis { Title = "Y Axis 3", Foreground = Brushes.Brown }
        };
    }

    public AxesCollection AxisYCollection { get; set; }

    public SeriesCollection SeriesCollection { get; set; }

}

, а XAML будет:

<Grid>
    <lvc:CartesianChart Series="{Binding SeriesCollection}" AxisY="{Binding AxisYCollection}" />
</Grid>

Конечно, вам нужно установить экземпляр класса ViewModel как DataContextвашего окна:

public MainWindow()
{
    vm = new ViewModel();

    InitializeComponent();
    DataContext = vm;
}

Если вы не объявите «достаточно» Оси в связанном AxesCollection, ее элемент с индексом n не будет найден, и вы попадете в исключение ArgumentOutOfRangeException .Я надеюсь, что это может помочь вам.

...