【问题标题】:WPF Toolkit: Bar Chart Axis Error When Trying to Swap AxesWPF 工具包:尝试交换轴时的条形图轴错误
【发布时间】:2018-05-10 06:14:09
【问题描述】:

我正在创建一个程序来从文件中收集数据、分析它并在条形图中显示数据。我为此使用 WPF,所以我从 NuGet 中获取了 WPFToolkit 和 WPFToolkit.DataVisualization。使用一组非常基本的 XAML,图表看起来很好,但它的轴被交换了——它给了我一个水平条形图,我想要列。所以我尝试交换轴,并得到以下错误:

分配的独立轴不能使用。这可能是由于轴的方向属性未设置。

这是我的代码,从我最终绑定到的集合中项目的定义开始:

间隔总结

public class IntervalSummary
{
    public IntervalSummary()
    {
        Results = new List<PollResult>();
    }

    public DateTime PeriodStart { get; set; }

    public DateTime PeriodEnd { get; set; }

    public int MinimumItemCount { get; set; }

    public int MaximumItemCount { get; set; }

    public int AverageItemCount { get; set; }

    public List<PollResult> Results { get; set; }
}

ViewModel 中的属性

请注意,我在这里使用的是 Caliburn.Micro,因此 Set() 方法基本上可以处理将值设置为支持字段以及属性更改通知。

public ObservableCollection<IntervalSummary> DataItems
{
    get { return _dataItems; }
    set { Set(ref _dataItems, value); }
}

图表 XAML

视图中有一大堆不相关的 XAML(即与这个问题无关)——按钮、GroupPanel、TextBoxes 等——我已经测试过并且有效。所以为了简洁起见,这只是 Window 定义(因此您可以看到 XML 命名空间声明)和图表声明。

<Window x:Class="QueueMonitorAnalyzer.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:QueueMonitorAnalyzer.Views"
        xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
        xmlns:datavis="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
        xmlns:toolkitEx="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
        mc:Ignorable="d">
    <Border Padding="5">
        <Grid>
            <datavis:Chart Name="Chart" Grid.Row="6" Title="Average Items in Queue">
                <datavis:Chart.Series>
                    <datavis:BarSeries Name="BarSeries" Title="Items (Avg.)" 
                                   ItemsSource="{Binding Path=DataItems}"
                                       DependentValueBinding="{Binding Path=AverageItemCount}"
                                       IndependentValueBinding="{Binding Path=PeriodStart}">
                        <datavis:BarSeries.DependentRangeAxis>
                            <datavis:LinearAxis Orientation="Y" Title="Item Count"/>
                        </datavis:BarSeries.DependentRangeAxis>

                        <datavis:BarSeries.IndependentAxis>
                            <datavis:DateTimeAxis Orientation="X" Title="Time Stamp"/>
                        </datavis:BarSeries.IndependentAxis>
                    </datavis:BarSeries>
                </datavis:Chart.Series>
            </datavis:Chart>
        </Grid>
    </Border>
</Window>

归根结底,这里的目标只是制作一个柱形图。如果我把&lt;datavis:BarSeries.DependentRangeAxis&gt;&lt;datavis:BarSeries.IndependentAxis&gt; 都省略了,我会得到一个水平图表,所以我只是把它们放在那里,以尝试交换轴并按照我想要的方向获取图表。

我尝试了很多方法,包括使用不同的轴类型(LinearAxisDateTimeAxisCategoryAxis)。我还尝试转储IndependentAxis 定义(只留下DependentRangeAxis),但这给了我以下错误:

分配的从属轴不能使用。这可能是由于未设置轴的方向属性或正在绘制的值与轴支持的值之间的类型不匹配。

基于此,我继续尝试将 IntervalSummary.AverageItemCount 数据类型更改为 doublefloat,这也让我一无所获。

谁能看到我在这里做错了什么?

最后,我之前说过一组基本的 XAML 可以正确生成图表,但方向不正确。这是基本的 XAML 集:

<datavis:Chart Name="Chart" Grid.Row="6" Title="Average Items in Queue">
    <datavis:Chart.Series>
        <datavis:BarSeries Name="BarSeries" Title="Items (Avg.)" 
                        ItemsSource="{Binding Path=DataItems}"
                            DependentValueBinding="{Binding Path=AverageItemCount}"
                            IndependentValueBinding="{Binding Path=PeriodStart}">
        </datavis:BarSeries>
    </datavis:Chart.Series>
</datavis:Chart>

【问题讨论】:

  • 使用ColumnSeries 而不是BarSeries
  • @jsanalytics 总是很简单,不是吗。 :) 谢谢!
  • 没有什么是一双新鲜的眼睛看不到的……:O)

标签: c# wpf xaml charts wpftoolkit


【解决方案1】:

如果你想显示列,你应该使用ColumnSeries:

<datavis:Chart Name="Chart" Grid.Row="6" Title="Average Items in Queue">
    <datavis:Chart.Series>
        <datavis:ColumnSeries Name="BarSeries" Title="Items (Avg.)" 
                              ItemsSource="{Binding DataItems}"
                              DependentValuePath="AverageItemCount"
                              IndependentValuePath="PeriodStart">
            <datavis:ColumnSeries.DependentRangeAxis>
                <datavis:LinearAxis Orientation="Y" Title="Item Count"/>
            </datavis:BarSeries.DependentRangeAxis>
                <datavis:ColumnSeries.IndependentAxis>
                <datavis:DateTimeAxis Orientation="X" Title="Time Stamp"/>
            </datavis:BarSeries.IndependentAxis>
        </datavis:ColumnSeries>
    </datavis:Chart.Series>
</datavis:Chart>

更多信息请参考以下文章:https://www.codeproject.com/Articles/196502/WPF-Toolkit-Charting-Controls-Line-Bar-Area-Pie-Co

【讨论】:

  • 做到了。我忘了有一个ColumnSeries 类型。突然间,一切都正常了。 :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多