2

我正在使用 WPF 工具包绘制简单的折线图。我的目标是通过数据绑定设置我的系列的线条颜色。这只是部分成功。问题是:为什么?

设置

命名空间:

xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="WpfApplication3.MainWindow"
xmlns:media="clr-namespace:System.Windows.Media;assembly=PresentationCore"

图表:

<chartingToolkit:Chart x:Name="chart">
    <chartingToolkit:LineSeries x:Name="seriesEntries" IndependentValueBinding="{Binding Key}" DependentValueBinding="{Binding Value}" DataPointStyle="{StaticResource CommonLineSeriesDataPoint}">
        <chartingToolkit:LineSeries.Tag>
            <media:Brush>Green</media:Brush>
        </chartingToolkit:LineSeries.Tag>
    </chartingToolkit:LineSeries>
</chartingToolkit:Chart>

暂时忽略Tag,后面会涉及到。

请注意,图表具有自定义数据点样式CommonLineSeriesDataPoint

<Style x:Key="CommonLineSeriesDataPoint" TargetType="chartingToolkit:LineDataPoint">
    <Setter Property="Background">
        <Setter.Value>
            <media:Brush>Red</media:Brush>
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="chartingToolkit:LineSeries">
    <Setter Property="DataPointStyle" Value="{StaticResource CommonLineSeriesDataPoint}" />
</Style>

正如预期的那样,这将我的系列系列染成红色

红线系列

突破性变化

现在我想数据绑定我的数据点背景。我只做一个改变。我没有直接指定背景画笔,而是将它绑定到Tagmy 的属性LineSeries,这也是一个画笔(参见前面LineSeries的声明,它是绿色的)。

<Style x:Key="CommonLineSeriesDataPoint" TargetType="chartingToolkit:LineDataPoint">
    <Setter Property="Background">
        <Setter.Value>
            <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType={x:Type chartingToolkit:LineSeries}}" />
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="chartingToolkit:LineSeries">
    <Setter Property="DataPointStyle" Value="{StaticResource CommonLineSeriesDataPoint}" />
</Style>

结果是这样的:

在此处输入图像描述

所以点是绿色的。但是线路没了

我的期望是也能看到一条绿线!它在哪里?

4

1 回答 1

0

我在 WPF Toolkit Sources 中挖掘后找到了解决方案。

原来Stroke系列的属性通过Polyline绑定到属性。我怀疑这不适合我尝试绑定属性本身。BackgroundTemplateBindingBackground

这个关于 SO 的答案建议TemplateBinding在编译时进行评估。所以让我们摆脱 TemplateBinding 并将Stroke属性直接绑定到Tagmy LineSeries(记住:Tag包含绿色画笔)。

从 WPF Toolkit Source \Source\DataVisualization\Themes\generic.xaml我复制了部分样式定义LineSeries并将其添加到我的ResourceDictionary

<Style x:Key="CommonLineSeries" TargetType="chartingToolkit:LineSeries" BasedOn="{StaticResource {x:Type chartingToolkit:LineSeries}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="chartingToolkit:LineSeries">
                <Canvas x:Name="PlotArea">
                    <Polyline Points="{TemplateBinding Points}" Stroke="{Binding Tag, RelativeSource={RelativeSource AncestorType={x:Type chartingToolkit:LineSeries}}}" Style="{TemplateBinding PolylineStyle}"/>
                </Canvas>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- charting:LineSeries -->(如果有兴趣,您可以在generic.xaml中搜索以找到我从中复制的源。)

我唯一修改的是Stroke. 在这里,我使用与数据点相同的绑定。

最后要做的事情:告诉LineSeries使用这种风格:

<chartingToolkit:LineSeries x:Name="seriesEntries" IndependentValueBinding="{Binding Key}" DependentValueBinding="{Binding Value}" DataPointStyle="{StaticResource CommonLineSeriesDataPoint}" Style="{StaticResource CommonLineSeries}">

你瞧,它有效。这条线又回来了,它是绿色的:

图表 - 固定线颜色

(如果您仔细观察,您会发现该系列的图例条目仍然有错误的颜色。但我认为解决方案将与上述非常相似。)

于 2012-12-15T11:38:55.820 回答