wpf OxyPlot触发LineSeries颜色更改通知

6tr1vspr  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(223)

我有一个oxyplot和一个带有ColorPickers的列表框来选择LineSeries颜色。

  • ColorPickers通过一个值转换器绑定到LineSeries(我不能使用oxyplot默认颜色转换器,因为ColorPickers使用可空的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颜色不会改变)

我想,问题是,添加到PlotModel.Series的LineSeries在我添加DataPoints之前没有有效的颜色集。

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

所以问题是:在手动更改ColorPickers之前,如何使ColorPickers在启动后使用LineSeries的有效颜色?
我希望避免在示例化时手动设置颜色,现在我对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>

字符串
ColorConverter 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的方法:

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

tyg4sfes

tyg4sfes1#

修改LineSeries示例化的工作原理:

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

字符串
还有别的办法吗例如,某种颜色属性改变事件?

eyh26e7m

eyh26e7m2#

答案晚了,但我有一个类似的要求,并通过子类化LineSeries类(我有其他原因这样做,不仅仅是这个)和使用'new'关键字覆盖基本Color属性,然后将我的视图控件绑定到被覆盖的属性来实现它;最后调用OnPropertyChanged或类似方法。大概是这样的:

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

字符串

相关问题