2015-06-09 31 views
1

我使用System.Windows.Controls.DataVisualization.Charting繪製並顯示包含Y值介於1至5之間的LineSeries的圖表。我將值添加到System.Collections.Generic.KeyValuePair(TKey,TValue)的LineSeries。我不想在Y標籤圖表中顯示從1到5的數字,而是要顯示從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(); 
    } 
} 

使用該轉換器定義自定義Ÿ標籤樣式:

<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

非常感謝您的回答,它非常完美!但是現在我又爲你提出了另一個問題:出於我的目的,我無法在xaml代碼中設置LinearAxis,因爲每次我想要顯示圖形時都需要創建一個新的LinearAxis(因爲Y軸的maxValue發生了變化)。當我在C#代碼中創建新的LinearAxis時,是否可以使用在xaml代碼中定義的Y標籤樣式?如果是,如何?提前致謝! – user3506770

+0

好吧,您不需要每次都通過代碼重新創建Y線性軸,只需定義一個屬性,該屬性將保存最大Y值並將Y最大值綁定到它的Maximum =「{Binding MaxY}」,並將轉換器以處理更多的5個字母(你可以找到更切割的方式來做到這一點,而不是那個醜陋的開關) – Usama

+0

非常感謝,現在它適用於我的目的!你已經解決了我所有的問題! :) – user3506770