LinearAxis没有十进制数字

时间:2011-01-25 09:11:29

标签: wpf silverlight data-visualization

我想避免使用Axis中的十进制数字,我该怎么做?

enter image description here

XAML:

 <Charting:Chart   VerticalAlignment="Stretch" 
                HorizontalContentAlignment="Stretch">

        <Charting:Chart.Axes>
            <Charting:LinearAxis  Orientation="Y" Minimum="0" Title="" Location="Left"
                    />
        </Charting:Chart.Axes>

        <Charting:Chart.Series>

            <Charting:ColumnSeries ItemsSource="{Binding Persons}"
                        DependentValueBinding="{Binding Count}"
                        IndependentValueBinding="{Binding Category}">
            </Charting:ColumnSeries>
        </Charting:Chart.Series>
    </Charting:Chart>

5 个答案:

答案 0 :(得分:3)

如果你还在努力解决这个问题,或者其他人有兴趣: 解决方案几乎是baalazamon写的。只是{0:0。##}将显示两位小数(如果它们存在)(这就是“。##”的含义)。所以你应该写的是

<Style x:Key="EmptyStyle" TargetType="charting:NumericAxisLabel"> 
    <Setter Property="IsTabStop" Value="False" /> 
    <Setter Property="StringFormat" Value="{0:0}" /> 
    <Setter Property="Template"> 
        <Setter.Value> 
            <ControlTemplate TargetType="charting:NumericAxisLabel"> 
                <TextBlock /> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</Style>

当然你需要添加:

<charting:LineSeries.DependentRangeAxis>    
        <charting:LinearAxis AxisLabelStyle="{StaticResource EmptyStyle}"    
            Orientation="Y"    
            ShowGridLines="True"/>    
</charting:LineSeries.DependentRangeAxis>

我希望这能解决你的问题。

答案 1 :(得分:2)

LinearAxis具有Iterval属性。尝试设置

 <Charting:Chart.Axes>
        <Charting:LinearAxis Interval="1" Orientation="Y" Minimum="0" Title="" Location="Left" />
    </Charting:Chart.Axes>

根据你的评论(对不起,我认为问题更简单;)),我使用类似的方法在Y轴上渲染标签:

在资源中,使用这样的风格

<Style x:Key="ChartLabelNoDecimal" TargetType="chartingToolkit:AxisLabel">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="chartingToolkit:AxisLabel">
                    <TextBlock DataContext="{TemplateBinding FormattedContent}" Text="{Binding Converter={StaticResource NumericConverter1}}" FontSize="9" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

public class NumericConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double x = double.Parse(value.ToString());

        if(/*check if has decimals*/) return string.Empty;
        else return x;

    }

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

然后您可以将具有此样式的LinearAxis添加到图表中。我的NumericConverter只是测试图表想要显示的标签的值,并使用我的逻辑相应地对其进行格式化。您可以测试值是否为整数,因此返回正确的字符串或否则为空。我认为它可行。

答案 2 :(得分:1)

您可以将样式更改为此样式:

<Style x:Key="EmptyStyle" TargetType="charting:NumericAxisLabel">
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="StringFormat" Value="{}{0:0.##}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="charting:NumericAxisLabel">
                <TextBlock />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

此外,您需要创建:

<charting:LineSeries.DependentRangeAxis>
        <charting:LinearAxis AxisLabelStyle="{StaticResource EmptyStyle}"
            Orientation="Y"
            ShowGridLines="True"/>
</charting:LineSeries.DependentRangeAxis>

这是唯一的例子,你需要根据自己的需要进行调整。 Example of slightly different thing但也许你会发现它很有用。

答案 3 :(得分:1)

这是我提出来解决此问题的解决方案,摘自blog

public class BarSeriesAxis : LinearAxis
{
    protected override double CalculateActualInterval(Size availableSize)
    {
        var result = base.CalculateActualInterval(availableSize);
        return (result < 1.0) ? 1.0 : result;
    }
}

你让图表做他们的事情,并在需要时覆盖间隔。容易将上面的内容更改为最接近的整数。

答案 4 :(得分:1)

只需使用LinearAxis的Interval属性:

<chartingToolkit:LinearAxis Orientation="Y" Interval="1" Minimum="0"/>

很适合我。