OxyPlot 触发线系列颜色更改通知



我有一个氧图和一个带有颜色选择器的列表框来选择线系列颜色。

ColorPickers
  • 通过值转换器绑定到LineSeries(我无法使用oxyplot默认颜色转换器,因为ColorPickers使用可为空的Color-s,所以我不得不"自定义"OxyPlot.Wpf.OxyColorConverter(
  • 颜色
  • 绑定在两个方向上工作:如果我在颜色选择器中更改颜色,首先调用 ConvertBack,然后调用转换函数。设置"线系列"颜色和"颜色选取器"颜色。
  • 在启动时,我将LineSeries添加到PlotModel.Series(见下文(
  • 之后,在添加第一个数据点之前,调用 ColorConverter.Convert 函数,值 = {A:0, B:1, G:0, R:0}。这会将拾色器颜色设置为某种透明(线系列颜色不会更改(

我想,问题是,在我向它们添加数据点之前,添加到 PlotModel.Series 的 LineSeries 没有有效的颜色集。

  • 我没有在系列或线系列实例上找到任何 RaisePropertyChanged 或类似的通知。
  • 我试图在第一个数据点之后调用 RaisePropertyChanged("PlotModel"(; 在第一个数据点之后 - 没有帮助,也没有"PlotModel.Series.Color"的任何组合
  • 在每个数据点之后调用 PlotModel.InvalidatePlot(true(,但这不会通知 ColorPickers 颜色更改。

所以问题是:在手动更改拾色器之前,如何让拾色器在启动后占用 LineSeries 的有效颜色?

我想避免在实例化时手动设置颜色,现在我对 PlotModel 分配给它们的颜色感到满意。

OxyPlot 和列表框:

<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 资源:

<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 l = new LineSeries { LineStyle = LineStyle.Solid, Title = title };
PlotModel.Series.Add(l);

修改 LineSeries 实例化有效:

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

还有其他方法吗? 例如,某种颜色属性更改事件?

回答较晚,但我有一个类似的要求,并通过子类化 LineSeries 类来实现它(我有其他原因这样做,不仅仅是这个(并使用"new"关键字重写基本 Color 属性,然后将我的视图控件绑定到被覆盖的属性; 最后调用 OnPropertyChanged 或类似内容。 像这样:

public new OxyColor Color
{
get => base.Color;
set
{
base.Color = value;
// other logic if any
OnPropertyChanged(nameof(Color));
}
}

最新更新