Вопрос или проблема
Я пытаюсь отрисовать вертикальную красную линию от низа до верха своей оси 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 на заданном значении длины волны выглядит хорошо, но, судя по предоставленному коду, есть несколько моментов, на которые стоит обратить внимание для успешного выполнения данной задачи.
Вот некоторые потенциальные проблемы и их решения:
-
Проверка диапазонов осей: Убедитесь, что значение
WavelengthSliderValue
, которое вы передаете в функциюUpdateRedLine
, действительно находится в диапазоне оси X. Если ваше значение вне этого диапазона, линия не будет видна. Чтобы убедиться, что у вас правильные минимальные и максимальные значения для оси X, вы можете временно вывести их в консоль. -
Инициализация серии линии: Убедитесь, что в
LineSeries
с красной линией установлены правильные стили (напримерLineStyle
иStrokeThickness
). У вас уже задана ширина линии (StrokeThickness = 15
), что может затруднить визуализацию, если линия попадет в область пересечения с другими визуальными элементами. -
Очистка данных: Перед добавлением новых точек в серию с красной линией, вы корректно очищаете предыдущие данные с помощью
redLineSeries.Points.Clear()
. Это хорошо, так как предотвратит наложение старых данных на новые. - Вызов
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("Не найдена серия красной линии.");
}
}
}
После этих изменений проверяйте, отображается ли красная линия корректно, когда изменяется значение ползунка. Убедитесь также, что у вас правильно указаны минимальные и максимальные значения для осей, чтобы обеспечить корректное отображение линии.
Если проблема все еще сохраняется, я рекомендую протестировать код на минимальном примере, который фокусируется именно на отображении этой вертикальной линии, чтобы исключить влияние других частей вашего проекта.
Желаю удачи в решении вашей задачи! Если возникнут дополнительные вопросы, не стесняйтесь задавать.