我有一个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的值无效。
任何建议表示赞赏。
答案 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。