Как условно отформатировать значения осей в Silverlight Toolkit LineSeries - PullRequest
3 голосов
/ 17 июня 2011

Я пытаюсь условно отформатировать числа, которые появляются на оси NumericAxis для LineSeries (из Silverlight 4 Toolkit).Чтобы быть более точным, я хочу, чтобы числа, которые были> = 10000 и <= 0,0001, отображались в научной нотации, но я не могу заставить эту работу работать.</p>

Я могу переопределить шаблон 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 ... конечно, должен быть способ!

Есть идеи?

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

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

Попробуйте установить для 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> 
2 голосов
/ 20 июня 2011

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

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

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

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

...