在刷新/更新时从循环停止WPF图表颜色

时间:2012-08-20 15:01:58

标签: wpf xaml charts

我有一个不断提取数据的图表,此刻刷新率设置为2分钟。问题是每次图表更新时,颜色都会变为循环中的下一个。我想也许我可以让图表在刷新时完全重置,以便每次都以0或1开始调色板颜色,但到目前为止还没有运气。有任何想法吗?

更新

一些XAML /代码可以提供更好的想法。

XAML for DynamicSeriesChart head

    <ana:DynamicSeriesChart SeriesSource="{Binding ChartSeries}" Title="{Binding ChartTitle}" Palette="{StaticResource ChartPalette}" Grid.Row="1" LegendTitle="Legend" Margin="0,25,0,0" Visibility="{Binding ShowGraph, Converter={StaticResource BoolToVisConv}}">

图表模板的XAML

        <ana:DynamicSeriesChart.Template>
            <ControlTemplate TargetType="charting:Chart">
                <Border Background="{DynamicResource ContainerElementContentPanelBgBrush}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <datavis:Title Content="{TemplateBinding Title}" Style="{TemplateBinding TitleStyle}" />

                        <chartingprimitives:EdgePanel x:Name="ChartArea" Grid.Row="1" Margin="0,15,0,15" Style="{TemplateBinding ChartAreaStyle}">
                            <Grid Canvas.ZIndex="-1" Style="{TemplateBinding PlotAreaStyle}" />
                            <Border Canvas.ZIndex="10" BorderBrush="#FF919191" BorderThickness="1" />
                        </chartingprimitives:EdgePanel>

                        <datavis:Legend x:Name="Legend" Style="{TemplateBinding LegendStyle}" Grid.Row="2" HorizontalAlignment="Left">
                            <datavis:Legend.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </datavis:Legend.ItemsPanel>
                        </datavis:Legend>
                    </Grid>
                </Border>
            </ControlTemplate>
        </ana:DynamicSeriesChart.Template>

Palette的样本

<Style x:Key="ColumnSeries1Style" TargetType="Control">
    <Setter Property="Background" Value="#FFFFA500" />
</Style>
<Style x:Key="ColumnSeries1Style2" TargetType="Shape">
    <Setter Property="Fill" Value="#FFFFA500" />
    <Setter Property="Stroke" Value="#FFFFA500" />
</Style>
...

...

<datavis:ResourceDictionaryCollection x:Key="ChartPalette">
    <ResourceDictionary>
        <Style x:Key="DataPointStyle" BasedOn="{StaticResource ColumnSeries1Style}" TargetType="Control" />
        <Style x:Key="DataShapeStyle" BasedOn="{StaticResource ColumnSeries1Style2}" TargetType="Shape" />
    </ResourceDictionary>
...

重新加载调用Refresh(),这是一个设置新Params的长查询。这将转到LoadData(),它转到ApplyResults(),它清除ChartSeries然后应用新值。

(我犹豫是否提出了代码隐藏或cs,因为它不是我的(并且仍然有点混淆我,参考和引用无处不在)。我还是比较新的参与其中在这个项目中,当我试图解决这个问题时仍然会发现新的部件。如果需要具体或操作流程,我会尽力去追捕这些部分。)

刷新后,图表(可以是“区域”,“条形图”,“列”或“线条”)将循环显示调色板颜色。例如,假设有3个条形图,目前为红色/蓝色/橙色。刷新后用新数据更新图表,颜色将改变并循环到调色板中的下一个 - 让我们说紫色/黄色/绿色。并且它将在每次刷新数据时继续在整个调色板中循环(并因此更改图表及其图例)。即使没有自定义调色板,也会发生这种情况。

更新

仔细研究这些问题,“线”图与其他图的行为不同。所以只有列/条/区域图表有这个问题。

1 个答案:

答案 0 :(得分:1)

如果您的折线图有效,但其他线图有循环颜色,您可以设置Palette属性的样式以检查正在使用的图形类型。然后,您可以将整个调色板应用于折线图,但让其他调色板将索引(您将添加到数据的任何位置)转换为颜色。有关转换过程的详细信息,请参阅this question

            <Style TargetType="ana:DynamicSeriesChart">
            <Setter Property="Palette" Value="{StaticResource ChartPalette}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsLineGraph}" Value="False">
                    <Setter Property="Palette">
                        <Setter.Value>
                            <datavis:ResourceDictionaryCollection>
                                <ResourceDictionary>
                                    <Style x:Key="DataPointStyle" TargetType="Control">
                                        <Setter Property="Background" Value="{Binding Path=PointColorIndex, 
                            Converter={StaticResource IndexColorConverter}, 
                            ConverterParameter={StaticResource ChartPalette}}"/>
                                    </Style>
                                    <Style x:Key="DataShapeStyle" TargetType="Shape">
                                        <Setter Property="Fill" Value="{Binding Path=FillColorIndex, 
                            Converter={StaticResource IndexColorConverter}, 
                            ConverterParameter={StaticResource ChartPalette}}"/>
                                        <Setter Property="Stroke" Value="{Binding Path=StrokeColorIndex, 
                            Converter={StaticResource IndexColorConverter}, 
                            ConverterParameter={StaticResource ChartPalette}}"/>
                                    </Style>
                                </ResourceDictionary>
                            </datavis:ResourceDictionaryCollection>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>