OxyPlot запускает уведомление об изменении цвета LineSeries - PullRequest
0 голосов
/ 26 августа 2018

У меня есть оксиплот и список с ColorPickers для выбора цветов LineSeries.

  • ColorPickers связаны с LineSeries через конвертер значений (я не мог использовать конвертер цветов oxyplot по умолчанию, потому что ColorPickers использует nullable Color-s, поэтому мне пришлось «настроить» OxyPlot.Wpf.OxyColorConverter)
  • Привязка цветов работает в обоих направлениях: если я меняю цвет в ColorPickers, сначала вызывается ConvertBack, а затем функция Convert. Цвет LineSeries и ColorPicker установлены.
  • При запуске я добавляю LineSeries в PlotModel.Series (см. Ниже)
  • После этого, перед тем как будут добавлены первые DataPoints, вызывается функция ColorConverter.Convert со значением = {A: 0, B: 1, G: 0, R: 0}. Это устанавливает цвета ColorPicker на какой-то прозрачный (цвета LineSeries не меняются)

Полагаю, проблема в том, что LineSeries, добавленные в PlotModel.Series, не имеют корректного набора цветов, прежде чем я добавлю к ним DataPoints.

  • Я не нашел RaisePropertyChanged или аналогичных уведомлений в экземплярах Series или LineSeries.
  • Я пытался вызвать RaisePropertyChanged ("PlotModel"); после первого назначения данных - не помогает ни с какой комбинацией "PlotModel.Series.Color"
  • PlotModel.InvalidatePlot (true); вызывается после каждой точки данных, но это не уведомляет ColorPickers об изменении цвета.

Таким образом, вопрос заключается в следующем: как я могу заставить ColorPickers принимать действительные цвета LineSeries после запуска, прежде чем ColorPickers будут изменены вручную?

Я бы хотел избежать установки цветов вручную при создании экземпляра, сейчас я доволен цветами, которые им назначает PlotModel.

OxyPlot и ListBox:

<oxy:PlotView Grid.Column="0" Grid.Row="0" x:Name="plot1" Model="{Binding PlotModel}"/>
...
<ListBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding PlotModel.Series}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding Path=IsVisible}" />
                <xctk:ColorPicker Width="30" ShowDropDownButton="False" SelectedColor="{Binding Path=Color, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ColorConverter}}" Opacity="1" ShowRecentColors="True"/>
                <TextBlock Text="{Binding Path=Title}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Ресурс XAML ColorConverter:

<local:ColorConverter x:Key="ColorConverter"></local:ColorConverter>

И код C #:

[ValueConversion(typeof(OxyColor), typeof(Rect))]
class ColorConverter : IValueConverter
{      
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is OxyColor)
        {
            var color = (OxyColor)value;
            if ((targetType == typeof(Color)) || (targetType == typeof(Color?)))
            {
                return color.ToColor();
            }

            if (targetType == typeof(Brush))
            {
                return color.ToBrush();
            }
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType == typeof(OxyColor))
        {
            if (value is Color)
            {
                var color = (Color)value;
                return OxyColor.FromArgb(color.A, color.R, color.G, color.B);
            }

            if (value is SolidColorBrush)
            {
                var brush = (SolidColorBrush)value;
                Color color = brush.Color;
                return OxyColor.FromArgb(color.A, color.R, color.G, color.B);
            }
        }

        return null;
    }

}

Вот как я динамически добавляю новые LineSeries:

LineSeries l = new LineSeries { LineStyle = LineStyle.Solid, Title = title };
PlotModel.Series.Add(l);

1 Ответ

0 голосов
/ 26 августа 2018

Изменение работ по созданию экземпляров LineSeries:

LineSeries l = new LineSeries { LineStyle = LineStyle.Solid, Title = title, Color = PlotModel.DefaultColors[PlotModel.Series.Count] };

Есть ли другой способ? Например. какое-то событие изменения свойства цвета?

...