如何在Silverlight Toolkit LineSeries中有条件地格式化轴值

时间:2011-06-17 08:10:24

标签: silverlight silverlight-4.0 charts silverlight-toolkit ivalueconverter

我试图有条件地格式化LineSeries的NumericAxis轴中出现的数字(来自Silverlight 4 Toolkit)。更具体地说,我希望以科学计数法显示> = 10000和< = 0.0001的数字,但我似乎无法使其工作。

我可以像这样覆盖NumericAxisLabel模板:

    <Style x:Key="NumericAxisLabelStyle" TargetType="chartingToolkit:NumericAxisLabel">
        <Setter Property="IsTabStop" Value="False"/>            
        <Setter Property="StringFormat" Value="{}{0:0.0E+00}" />                        
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="chartingToolkit:NumericAxisLabel">
                    <TextBlock Text="{TemplateBinding FormattedContent}"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

但这会将科学记数法格式应用于轴中的所有标签。我想要的是字符串格式表达式仅在我上面提到的条件发生时“启动”。

通过使用带有自定义值转换器的绑定,我能够在LineDataPoint工具提示模板中轻松完成此操作,如下所示:

 <ControlTemplate TargetType="chartingToolkit:LineDataPoint">
      <Grid x:Name="Root" Opacity="0">
           <ToolTipService.ToolTip>
                <StackPanel Margin="2,2,2,2">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="X:" />                                        
                        <ContentControl Content="{Binding objResultValueX, Converter={StaticResource ToCustomStringFormat}}"/>
                     </StackPanel>
                     <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Y:" />
                        <ContentControl Content="{Binding dblResultValueY, Converter={StaticResource ToCustomStringFormat}}"/>
                      </StackPanel>
                 </StackPanel>
            </ToolTipService.ToolTip>
            ...
    </Grid>
 </ControlTemplate>

如果我只能为NumericAxisLabelStyle中的“FormattedContent”指定转换器,就像我为LineDataPoint模板做的那样......当然必须有办法!

有什么想法吗?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

尝试将TextBlock的DataContext设置为FormattedContent。然后将转换器应用于Text属性,如下所示:

<Style x:Key="NumericAxisLabelStyle" TargetType="chartingToolkit:NumericAxisLabel"> 
    <Setter Property="IsTabStop" Value="False"/> 
    <Setter Property="Template"> 
    <Setter.Value > 
        <ControlTemplate TargetType="chartingToolkit:NumericAxisLabel"> 
            <TextBlock DataContext="{TemplateBinding FormattedContent}" Text ="{Binding Converter={StaticResource ToCustomStringFormat}}"/> 
        </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

答案 1 :(得分:2)

也可以从Toolkit的DisplayAxis类中重写PrepareAxisLabel()方法。

原始方法(找到here)的源代码是:

protected virtual void PrepareAxisLabel(Control label, object dataContext)
    {
        label.DataContext = dataContext;
        label.SetStyle(AxisLabelStyle);
    }

因此,您可以使用以下内容覆盖它:

public class MyLinearAxis : LinearAxis
{     
    protected override void PrepareAxisLabel(Control label, object dataContext)
    {   
        (label as AxisLabel).StringFormat = "{0:c}";   // currency format, for example
        dataContext = 10.0;                            // your own custom numeric value

        base.PrepareAxisLabel(label, dataContext);
    }
}

通过这种方式,您可以在创建标签时完全控制标签。