Как условно форматировать значения осей в Silverlight Toolkit LineSeries

Я пытаюсь условно отформатировать числа, которые отображаются на оси NumericAxis для LineSeries (из 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>

Если бы я только мог указать преобразователь для «FormattedContent» в NumericAxisLabelStyle, как я делаю это для шаблона LineDataPoint... наверняка должен быть способ!

Любые идеи?

Заранее спасибо за помощь!


person Victor Van Halen    schedule 17.06.2011    source источник


Ответы (2)


Попробуйте установить для DataContext TextBlock значение 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> 
person tsiorn    schedule 20.06.2011
comment
Да, это помогло. Это только показывает, насколько важно понимать роль DataContext при создании шаблонов элементов управления! - person Victor Van Halen; 20.06.2011

Также возможно переопределить метод PrepareAxisLabel() из класса DisplayAxis Toolkit.

Исходный код исходного метода (найден здесь):

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);
    }
}

Таким образом, вы можете получить полный контроль над созданной этикеткой.

person Chris    schedule 20.06.2011
comment
Спасибо, Крис. Это может пригодиться с чем-то еще, что я пытаюсь сделать. Я голосую за ваш ответ :-) - person Victor Van Halen; 18.07.2011