WPF工具包图表:将标签可见性绑定到转换器时刷新轴标签可见性

时间:2015-12-16 18:16:20

标签: c# xml wpf xaml charts

我有一个WPF工具包折线图,我想控制显示的CategoryAxis(x轴)标签的数量。如果标签数量超过某个值,我只想显示每个第n个标签以保持清晰。

为实现这一目标,我创建了一个IValueConverter并将其绑定到AxisLabelStyle的Visibility属性。相关的XAML看起来像这样(注意我也在旋转标签,这部分工作正常):

<chartingToolkit:Chart.Resources>
  <app:HideConverter x:Key="HideConverter1" />                            
</chartingToolkit:Chart.Resources>
...
...
<chartingToolkit:CategoryAxis Orientation="X" Title="" ShowGridLines="False">
    <chartingToolkit:CategoryAxis.AxisLabelStyle>
      <Style TargetType="chartingToolkit:AxisLabel">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="chartingToolkit:AxisLabel">
              <Canvas Height="55">
                <Label Content="{TemplateBinding FormattedContent}" 
                       FontSize="12" Foreground="Black"                                                                
                       Visibility="{Binding Converter={StaticResource HideConverter1}}">
                <Label.RenderTransform>
                  <TransformGroup>
                    <RotateTransform Angle="-45" />
                    <TranslateTransform X="-50" Y="0"/>
                  </TransformGroup>
                </Label.RenderTransform>
                <Label.RenderTransformOrigin>
                  <Point>1.0, 1.0</Point>
                </Label.RenderTransformOrigin>
              </Label>
            </Canvas>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </chartingToolkit:CategoryAxis.AxisLabelStyle>

这里是转换器的C#代码:

public class HideConverter:IValueConverter
{
    private int hitCount = 0;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        hitCount++;

        if (hitCount % INTERVAL_VALUE == 0.0)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Hidden;
        }            
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

因此,如果我设置INTERVAL_VALUE = 20,我会得到每个20个标签。首次显示图表时,可以正常运行

问题在于,当我在代码中更新INTERVAL_VALUE时,我无法让CategoryAxis重新绘制自己。

我试图使整个图表无效以强制重新绘制,但没有效果。基本上转换器代码仅在首次呈现图表时调用,并且从不再次调用,因此更改INTERVAL_VALUE的值无效。

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

这类问题促使我为wpf创建自己的图表库。它尚未准备好进行生产,但现在有几个月的调试。

在这个库中保持清晰是完全自动的,你不需要编写一行代码来实现这一点,因为这是默认行为,可以很容易地自定义以获得自定义行为。

你不能旋转标签(不是现在),但它足够清晰和干净。

https://github.com/beto-rodriguez/Live-Charts

希望这有帮助,这是一个例子

<liveCharts:LineChart Name="Chart">
    <liveCharts:LineChart.Series>
       <liveCharts:LineSeries Name="MariaSeries" Title="Maria" 
                              PrimaryValues="2, 4, 6, 8" />
       <liveCharts:LineSeries Name="JohnSeries" Title="John" 
                              PrimaryValues="5, 6, 7, 9" />
     </liveCharts:LineChart.Series>
</liveCharts:LineChart>

当然它支持绑定和更复杂的sintax,这只是一个例子,你可以在Docs中找到更多的例子或者克隆repo。

enter image description here