我试图有条件地格式化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模板做的那样......当然必须有办法!
有什么想法吗?
提前感谢您的帮助!
答案 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);
}
}
通过这种方式,您可以在创建标签时完全控制标签。