【问题标题】:Stopping WPF Chart Colors From Cycling on Refresh/Update在刷新/更新时停止 WPF 图表颜色循环
【发布时间】:2012-08-20 15:01:58
【问题描述】:

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

更新

一些 XAML/代码以获得更好的想法。

DynamicSeriesChart 头部的 XAML

    <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>

调色板示例

<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(),这是一个设置新参数的长查询。这将转到 LoadData(),然后转到 ApplyResults(),后者会清除 ChartSeries,然后应用新值。

(我很犹豫是否要放置代码隐藏或 cs,因为它们都不是我的(而且仍然让我有些困惑,到处都是参考和参考)。我在参与它方面仍然相对较新在这个项目中,并且在我试图解决这个问题时仍然发现新的部分。如果需要细节或操作流程,我会尽我所能去寻找那些部分。)

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

更新

仔细观察这些问题,“线”图的行为与其他图不同。所以只有柱形图/条形图/面积图有这个问题。

【问题讨论】:

  • 您能展示一个简单的代码示例吗?我不确定我是否理解
  • 听起来您的实际问题在于您如何决定使用哪种颜色。您需要一种方法来重置调色板的偏移量,但如果没有关于您正在做什么的更多信息,我无法进一步帮助您。
  • @steveg89 据我所知,颜色仅在 xaml DynamicSeriesChart 标记中指定为调色板。它是一个静态资源,链接到一组包含 DataPointStyle 和 DataShapeStyle 的 ResourceDictionaries。我一直无法找到在每次刷新时重置调色板的方法。不过,我想避免调用一个全新的图表 - 考虑到关闭/打开图表确实会重置调色板。
  • 这段代码并没有告诉我们太多。这是我们可能感兴趣的 Refresh,和/或它调用的任何方法,以及图表的 XAML。

标签: wpf xaml charts


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2020-11-17
    • 2015-05-04
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多