2015-06-09 2 views
1

Я использую System.Windows.Controls.DataVisualization.Charting для рисования и отображения диаграммы с помощью LineSeries, значения Y которых находятся в диапазоне от 1 до 5. Я добавляю значения в LineSeries с System.Collections.Generic.KeyValuePair(TKey,TValue). Вместо того, чтобы показывать цифры от 1 до 5 в таблице ярлыков Y, я хочу отображать буквы от E до A.xaml C# диаграмма с меткой пользовательской оси

Как достичь этих результатов?

+0

Я использую .NET Framework 4.5 – user3506770

+0

я не могу найти информацию по этому пространству имен. Не могли бы вы использовать System.Web.UI.DataVisualization.Charting? –

ответ

4

Первый создать конвертер для преобразования числовых значений в алфавите из них:

public class NumericToAlphaConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     switch (value.ToString()) 
     { 
      case "1": 
       return "A"; 
      case "2": 
       return "B"; 
      case "3": 
       return "C"; 
      case "4": 
       return "D"; 
      case "5": 
       return "E"; 
      default: return null; 
     } 
    } 

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

использование, что конвертер для определения пользовательских Y стиль метки:

<Style TargetType="chartingToolkit:AxisLabel"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="chartingToolkit:AxisLabel"> 
            <TextBlock DataContext="{TemplateBinding FormattedContent}" Text="{Binding Converter={StaticResource NumericToAlphaConverter}}" /> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 

здесь отверстие UI и соответствующий код за

<Window.Resources> 
    <wpfApplication12:NumericToAlphaConverter x:Key="NumericToAlphaConverter"/> 
</Window.Resources> 
<Grid> 
    <chartingToolkit:Chart Title="Line Series" 
    VerticalAlignment="Top" Margin="0" Height="254" > 
     <chartingToolkit:LineSeries x:Name="serie" 
            IndependentValueBinding="{Binding Path=Key}" 
            DependentValueBinding="{Binding Path=Value}"  
    IsSelectionEnabled="True"/> 
     <chartingToolkit:Chart.Axes> 
      <chartingToolkit:LinearAxis Orientation="Y" 
            Title="Y val" 
             Maximum="5" 
             Minimum="1" 
             > 
       <chartingToolkit:LinearAxis.AxisLabelStyle> 
        <Style TargetType="chartingToolkit:AxisLabel"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="chartingToolkit:AxisLabel"> 
            <TextBlock DataContext="{TemplateBinding FormattedContent}" Text="{Binding Converter={StaticResource NumericToAlphaConverter}}" /> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </chartingToolkit:LinearAxis.AxisLabelStyle> 
      </chartingToolkit:LinearAxis> 
     </chartingToolkit:Chart.Axes> 

    </chartingToolkit:Chart> 
</Grid> 

код позади:

public ObservableCollection<KeyValuePair<int, int>> LineSeriesData = new ObservableCollection<KeyValuePair<int, int>>() 
    { 
     new KeyValuePair<int, int>(12,1), 
     new KeyValuePair<int, int>(5,2), 
     new KeyValuePair<int, int>(5,3), 
     new KeyValuePair<int, int>(5,4) 

    }; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     serie.ItemsSource = LineSeriesData; 
    } 

enter image description here

+0

Большое спасибо за ваш ответ, он отлично работает! Но теперь у меня есть еще один вопрос: для моих целей я не могу установить LinearAxis в xaml-коде, потому что мне нужно создавать новый LinearAxis каждый раз, когда я хочу показать график (потому что maxValue оси Y меняется). Можно ли использовать стиль ярлыка Y, определенный в коде xaml, когда я создаю новый LinearAxis в своем коде на C#? Если да, то как? Заранее спасибо! – user3506770

+0

, вам не нужно каждый раз воссоздавать линейные оси Y по коду, просто определите свойство, которое будет удерживать максимальное значение Y и свяжет максимум Y с ним Maximum = "{Binding MaxY}", и расширьте преобразователь чтобы обрабатывать более 5 букв (вы могли бы найти более гибкий способ сделать это вместо этого уродливого переключателя) – Usama

+0

Большое спасибо, теперь он отлично работает для моих целей! Вы решили все мои проблемы! :) – user3506770

Смежные вопросы