OxyPlot не отображает вертикальную линию ползунков внутри графика

Вопрос или проблема

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

Вот мой код:


         public PlotViewModel()
        {
            InitializeRenderingLoop();

            // Инициализация SpectralPlotModel
            SpectralPlotModel = new PlotModel
            {
                Title = "Данные из сокета",
                Background = OxyColors.Transparent,
                TextColor = OxyColors.White,
                PlotAreaBorderColor = OxyColors.White
            };

            SpectralPlotModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Bottom,
                Title = "Длина волны",
                TitleColor = OxyColors.White,
                AxislineColor = OxyColors.White,
                TextColor = OxyColors.White,
                StringFormat = "0.###",
            });

            SpectralPlotModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Left,
                Title = "Данные",
                TitleColor = OxyColors.White,
                AxislineColor = OxyColors.White,
                TextColor = OxyColors.White,
                StringFormat = "0.###",
                Minimum = 0,
                Maximum = 5
            });

            SpectralPlotModel.Series.Add(new LineSeries
            {
                Title = "Данные",
                Color = OxyColors.White,
                MarkerFill = OxyColors.White,
                MarkerType = MarkerType.None,
                LineStyle = LineStyle.Solid,
                StrokeThickness = 2
            });

            SpectralPlotModel.Series.Add(new LineSeries
            {
                Title = "Красная линия",
                Color = OxyColors.Red,
                MarkerFill = OxyColors.Red,
                MarkerType = MarkerType.Cross,
                LineStyle = LineStyle.Solid,
                StrokeThickness = 15,
            });

        }

И логика функции:

        public double WavelengthSliderValue
        {
            get => _wavelengthSliderValue;
            set
            {
                if (_wavelengthSliderValue != value)
                {
                    _wavelengthSliderValue = value;
                    OnPropertyChanged();
                    UpdateRedLine();
                }
            }
        }

        public void UpdateRedLine()
        {

            if (SpectralPlotModel != null && SpectralPlotModel.Series.Count > 1)
            {
                var redLineSeries = SpectralPlotModel.Series[1] as LineSeries;

                if (redLineSeries != null)
                {
                    var selectedWavelength = WavelengthSliderValue;
                    Debug.Print("Длина волны: " + selectedWavelength);

                    // Очистка существующих точек
                    redLineSeries.Points.Clear();

                    // Убедитесь, что пределы осей правильные
                    var yAxis = SpectralPlotModel.Axes[1];
                    redLineSeries.Points.Add(new DataPoint(selectedWavelength, yAxis.Minimum)); // Мин. Y
                    redLineSeries.Points.Add(new DataPoint(selectedWavelength, yAxis.Maximum)); // Макс. Y
                    SpectralPlotModel.InvalidatePlot(true);
                }
                else
                {

                    Debug.Write("Не найдена серия красной линии");
                }
            }
        }

Внутри UpdateRedLine я правильно получаю длину волны, так что число, которое я получаю, верно, но по какой-то причине моя красная линия вообще не отображается.

Я что-то неправильно настроил?

Спасибо.

Ответ или решение

Доброго времени суток!

Ваша задача по отрисовке вертикальной линии в OxyPlot на заданном значении длины волны выглядит хорошо, но, судя по предоставленному коду, есть несколько моментов, на которые стоит обратить внимание для успешного выполнения данной задачи.

Вот некоторые потенциальные проблемы и их решения:

  1. Проверка диапазонов осей: Убедитесь, что значение WavelengthSliderValue, которое вы передаете в функцию UpdateRedLine, действительно находится в диапазоне оси X. Если ваше значение вне этого диапазона, линия не будет видна. Чтобы убедиться, что у вас правильные минимальные и максимальные значения для оси X, вы можете временно вывести их в консоль.

  2. Инициализация серии линии: Убедитесь, что в LineSeries с красной линией установлены правильные стили (например LineStyle и StrokeThickness). У вас уже задана ширина линии (StrokeThickness = 15), что может затруднить визуализацию, если линия попадет в область пересечения с другими визуальными элементами.

  3. Очистка данных: Перед добавлением новых точек в серию с красной линией, вы корректно очищаете предыдущие данные с помощью redLineSeries.Points.Clear(). Это хорошо, так как предотвратит наложение старых данных на новые.

  4. Вызов InvalidatePlot: Вы правильно используете метод InvalidatePlot(true) после добавления точек к серии. Это гарантирует, что график будет обновлен, и изменения будут отображены.

Вот исправленный вариант функцией UpdateRedLine с дополнительными проверками:

public void UpdateRedLine()
{
    if (SpectralPlotModel != null && SpectralPlotModel.Series.Count > 1)
    {
        var redLineSeries = SpectralPlotModel.Series[1] as LineSeries;

        if (redLineSeries != null)
        {
            var selectedWavelength = WavelengthSliderValue;
            Debug.Print("Wavelength : " + selectedWavelength);

            // Получаем минимальное и максимальное значение по Y
            var yAxis = SpectralPlotModel.Axes[1];

            // Проверяем, что значение длины волны находится в допустимом диапазоне
            if (selectedWavelength >= SpectralPlotModel.Axes[0].Minimum && selectedWavelength <= SpectralPlotModel.Axes[0].Maximum)
            {
                // Очищаем существующие точки
                redLineSeries.Points.Clear();

                // Добавляем новые точки для рисования вертикальной линии
                redLineSeries.Points.Add(new DataPoint(selectedWavelength, yAxis.Minimum)); // Минимум Y
                redLineSeries.Points.Add(new DataPoint(selectedWavelength, yAxis.Maximum)); // Максимум Y
            }
            else
            {
                Debug.Print("Ошибка: Длина волны вне диапазона оси X.");
            }

            // Обновление графика
            SpectralPlotModel.InvalidatePlot(true);
        }
        else
        {
            Debug.Print("Не найдена серия красной линии.");
        }
    }
}

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

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

Желаю удачи в решении вашей задачи! Если возникнут дополнительные вопросы, не стесняйтесь задавать.

Оцените материал
Добавить комментарий

Капча загружается...