【问题标题】:How to swap axes in WPF Toolkit line chart?如何在 WPF Toolkit 折线图中交换轴?
【发布时间】:2012-01-10 20:03:12
【问题描述】:

如何交换 WPF Toolkit 折线图中的轴?我有以下 xaml:

<chartingToolkit:Chart  Name="lineChart" Title="Line Series Demo" Margin="0,0,0,0">
     <chartingToolkit:LineSeries  DependentValuePath="Key" IndependentValuePath="Value" ItemsSource="{Binding}" IsSelectionEnabled="True" />
  </chartingToolkit:Chart>

从属值始终显示为 Y 轴。我需要它们作为 X 轴。 WPF Toolkit 图表可以做到这一点吗?如果我不能使用 WPF Toolkit 执行此操作,是否可以使用其他免费的 WPF 图表库来代替?我需要的只是折线图,它可以处理 X 轴上的时间和 Y 轴上的字符串的多个系列。

【问题讨论】:

  • 你不能只设置DependentValuePath="Value" IndependentValuePath="Key"吗?
  • @djacobson 数据被定义为KeyValuePair&lt;DateTime, string&gt; 所以如果我按照你的建议切换值和键,我会得到一个 InvalidOperationException "没有合适的轴可用于绘制依赖值。"

标签: wpf charts wpftoolkit


【解决方案1】:

在尝试找到原始 WPF 工具包问题的答案失败后,我决定自己编辑图表工具包源。以下是我为使其正常工作所做的更改:

(显示源代码更改,要查看原始源,请在编辑之前查看原始帖子)

  1. 获取来源。我正在使用 VS2010 并且由于某些组件 来自 WPF Toolkit 已成为 .NET4 的一部分,我不得不修改 WPF 工具包解决方案。值得庆幸的是,我已经为我完成了这项工作。 获取源here

  2. 将 LineSeries.cs:115 更改为

                    if (axis == null)
                    {
                       axis = new CategoryAxis();
                    } 
    
  3. 将 LineAreaBaseSeries.cs:243 更改为

       double x = ActualIndependentAxis.GetPlotAreaCoordinate(dataPoint.ActualIndependentValue).Value;
       double y = this.InternalActualDependentAxis.GetPlotAreaCoordinate(dataPoint.ActualDependentValue).Value;
    
       if (ValueHelper.CanGraph(x) && ValueHelper.CanGraph(y))
       {
          dataPoint.Visibility = Visibility.Visible;
    
          double coordinateY = Math.Round(y - (dataPoint.ActualHeight / 2));
          Canvas.SetTop(dataPoint, coordinateY);
          double coordinateX = Math.Round(x - (dataPoint.ActualWidth / 2));
          Canvas.SetLeft(dataPoint, coordinateX);
       }
       else
       {
          dataPoint.Visibility = Visibility.Collapsed;
       }
    

将 LineAreaBaseSeries.cs:298 更改为

       Func<DataPoint, Point> createPoint =
           dataPoint =>
               new Point(
                   ActualIndependentAxis.GetPlotAreaCoordinate(dataPoint.ActualIndependentValue).Value,
                   this.InternalActualDependentAxis.GetPlotAreaCoordinate(dataPoint.ActualDependentValue).Value);
       IEnumerable<Point> points = Enumerable.Empty<Point>();
       if (ActualIndependentAxis is IRangeAxis)
       {
          points = DataPointsByIndependentValue.Select(createPoint);
       }
       else
       {
          points =
             ActiveDataPoints
                   .Select(createPoint)
                   .OrderBy(point => point.X);
       }

在这些更改之后,您可以使用依赖的字符串源。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多