【问题标题】:xaml c# chart with custom axis label带有自定义轴标签的xaml c#图表
【发布时间】:2015-06-09 22:47:46
【问题描述】:

我使用System.Windows.Controls.DataVisualization.Charting 绘制并显示带有 Y 值在 1 到 5 之间的 LineSeries 的图表。我使用 System.Collections.Generic.KeyValuePair(TKey,TValue) 向 LineSeries 添加值。我不想在 Y 标签图表中显示从 1 到 5 的数字,而是想显示从 E 到 A 的字母。

我怎样才能达到这个结果?

【问题讨论】:

  • 我使用 .NET Framework 4.5
  • 我找不到有关该名称空间的信息。您可以改用 System.Web.UI.DataVisualization.Charting 吗?

标签: c# wpf xaml charts


【解决方案1】:

首先创建一个转换器,将数值转换为字母:

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

【讨论】:

  • 非常感谢您的回答,效果很好!但是现在我有另一个问题要问您:出于我的目的,我无法在 xaml 代码中设置 LinearAxis,因为每次我想显示图形时都需要创建一个新的 LinearAxis(因为 Y 轴的 maxValue 会发生变化)。当我在 C# 代码中创建新的 LinearAxis 时,是否可以使用在 xaml 代码中定义的 Y 标签样式?如果是,如何?提前致谢!
  • 好吧,您不需要每次都通过代码重新创建 Y 线性轴,只需定义一个将保存最大 Y 值并将 Y 最大值绑定到它的属性Maximum="{Binding MaxY }",并扩展转换器以处理超过 5 个字母(您可以找到一种更简洁的方法来代替那个丑陋的开关)
  • 非常感谢,现在它非常适合我的目的!你解决了我所有的问题! :)
猜你喜欢
  • 2014-09-20
  • 2014-10-02
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多