如何从dataGrid_SelectedCellsChanged事件动态更改wpf折线图上的DataPointStyle

时间:2011-03-11 14:17:26

标签: wpf colors line charts

我正在使用WPFToolkit创建一个包含多个LineSeries(多种颜色)的折线图。我有一个DataGrid控件,其中DataGrid.RowCount = LineSeriesCount。数据网格显示图表中每一行的相关数据。

当我在dataGrid_SelectedCellsChanged上选择相应的数据网格时,我需要突出显示(将其颜色更改为黑色)图表中的行。

我尝试了以下链接,但没有帮助:Change a style dynamically in WPF

所以var dpStyle = new Style(){BasedOn = originalStyle};没有用。

我正在使用下面的代码创建必要的样式:

public Window1()
    {
        InitializeComponent();          
        dataGrid1.Width = mcChart.Width;
        HighlightedBlackDataPointStyle = new Style(typeof(LineDataPoint));
        HighlightedBlackDataPointStyle.Setters.Add(new Setter(LineDataPoint.VisibilityProperty, Visibility.Hidden));            HighlightedBlackDataPointStyle.Setters.Add(new Setter(LineDataPoint.OpacityProperty, 0.01));            HighlightedBlackDataPointStyle.Setters.Add(new Setter(LineDataPoint.BackgroundProperty, new SolidColorBrush(Colors.Black)));
        this.Resources.Add("HighlightedBlackDataPointStyle", HighlightedBlackDataPointStyle);


    } 

这就是我试图设置上述风格的方式:

private void dataGrid1_SelectedCellsChanged(object sender, System.Windows.Controls.SelectedCellsChangedEventArgs e)
    {
        if (dataGrid1.SelectedIndex >= 0)
        {
            mcChart.Series.OfType<LineSeries>().ElementAt(dataGrid1.SelectedIndex).DataPointStyle = HighlightedBlackDataPointStyle;
            mcChart.Series.OfType<LineSeries>().ElementAt(dataGrid1.SelectedIndex).Refresh();
            mcChart.Series.OfType<LineSeries>().ElementAt(dataGrid1.SelectedIndex).UpdateLayout();
            mcChart.UpdateLayout();
        }
    } 

这会将Legend的颜色更改为黑色而不是预期的行。

我在创建它时通过设置Sytle在C#codebehind中添加了所有lineSeries。我在XAML中没有任何样式定义。因此,不确定我是否可以使用XAML中的DynamicResource绑定。

请让我知道如何从C#代码而不是XAML实现这一目标。

1 个答案:

答案 0 :(得分:0)

这个问题已经过时了,但我会回答,因为也许有人有同样的问题。

实际上它并不像看起来那么困难。 要更改线条的颜色,只需使用Background的{​​{1}}属性:

LineSeries

我使用 private Brush previousColor; private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.RemovedItems != null && e.RemovedItems.Count > 0) { var removedItem = (ItemViewModel)e.RemovedItems[0]; var line = chart.Series.OfType<LineSeries>().FirstOrDefault(ls => (int)ls.Tag == removedItem.Id); line.Background = previousColor; } if (e.AddedItems != null && e.AddedItems.Count > 0) { var selectedItem = (ItemViewModel)e.AddedItems[0]; var line = chart.Series.OfType<LineSeries>().FirstOrDefault(ls => (int)ls.Tag == selectedItem.Id); previousColor = line.Background; line.Background = Brushes.Black; } } 属性,因为可以通过排序更改项的行索引,而Id始终是相同的。

Tag

我尚未发布<charting:Chart x:Name="chart" DataContext="{Binding Items}" Grid.Row="1" Grid.Column="1"> <charting:Chart.Series> <charting:LineSeries DataContext="{Binding [0]}" ItemsSource="{Binding ChartItems}" Title="{Binding Title}" Tag="{Binding Id}" IndependentValuePath="XValue" DependentValuePath="YValue" /> 的代码和ItemViewModel的xaml,但我认为主要想法很明确。