LiveCharts ColumnSeries不显示

时间:2019-01-12 17:49:12

标签: c# wpf livecharts

我在WPF中使用LiveCharts来可视化一些分析的结果。分析结果将添加到SeriesCollection并显示在CartesianChart中。您可以选择要使用的系列类型:LineSeries或ColumnSeries。然后创建选定的类型并将其添加到SeriesCollection。

有一个自定义映射器,用于从ChartValues中选择X和Y值,并为X轴选择AxisFormatter。

这些图表是Blacklight.Controls.Wpf.DragDockPanelHost的一部分。每个图表都是一个DragDockPanel,具有附加的样式。图表本身是一个带有TemplateSelector的ContentControl,该控件将CartesianChart-XAML作为DataTemplate返回。

我已经尝试过手动设置系列的Fill或Stroke或在其中手动放置一些ColumnSeries,但这根本没有帮助。

SeriesCollection的填充:

private SeriesCollection _Series;
public SeriesCollection Series
{
    get { return _Series; }
    set { SetProperty<SeriesCollection>(ref _Series, value); }
}

...

private void createDiagram()
{
    if (this._Analysis!= null && this._Diagram != null)
    {
        this.Series.Clear();
        foreach (KeyValuePair<state, Dictionary<DateTime, int>> kvp in this.Analysis.Execute())
        {
            Series series = Activator.CreateInstance(Diagram) as Series;
            if (series != null)
            {
                series.Title = kvp.Key.name;
                series.Values = new ChartValues<KeyValuePair<DateTime, int>>(kvp.Value);
                this.Serien.Add(series);
            }
        }
    }
}

映射器和AxisFormatter:

CartesianMapper<KeyValuePair<DateTime, int>> mapper = Mappers.Xy<KeyValuePair<DateTime, int>>().X(kvp => ((DateTimeOffset)kvp.Key).ToUnixTimeSeconds()).Y(kvp => kvp.Value);
this.Series = new SeriesCollection(mapper);
this.XFormatter = value =>
{
    return DateTimeOffset.FromUnixTimeSeconds((long)value).DateTime.ToString("dd.MM.yyyy HH:mm");
};

TemplateSelector:

public class DashboardElementTemplateSelector : DataTemplateSelector
  {
    public DataTemplate ListDashboardElementTemplate { get; set; }
    public DataTemplate SingleValueDashboardElementTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
      if (item is ListDashboardElementViewModel)
        return this.ListDashboardElementTemplate;
      else
        return this.SingleValueDashboardElementTemplate;
    }
  }

DragDockPanelHost的XAML:

  <UserControl.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary>
          <DataTemplate x:Key="listElement">
            <views:ListDashboardElementView/>
          </DataTemplate>
          <DataTemplate x:Key="singleValueElement">
            <views:SingleValueDashboardElementView/>
          </DataTemplate>
          <tempselect:DashboardElementTemplateSelector x:Key="elementTempSelector"
                                                       ListDashboardElementTemplate="{StaticResource listElement}"
                                                       SingleValueDashboardElementTemplate="{StaticResource singleValueElement}"
                                                       />
        </ResourceDictionary>
        <ResourceDictionary>
          <conv:BooleanToVisibilityConverter x:Key="visCon"/>
        </ResourceDictionary>
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </UserControl.Resources>

<bl:DragDockPanelHost ItemsSource="{Binding Diagrams}" Grid.Row="1" Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
      <bl:DragDockPanelHost.Style>
        <Style TargetType="bl:DragDockPanelHost">
          <Setter Property="ItemsPanel">
            <Setter.Value>
              <ItemsPanelTemplate>
                <Canvas ClipToBounds="True" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                </Canvas>
              </ItemsPanelTemplate>
            </Setter.Value>
          </Setter>
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="bl:DragDockPanelHost">
                <ItemsPresenter/>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </bl:DragDockPanelHost.Style>
      <bl:DragDockPanelHost.DefaultPanelStyle>
        <Style TargetType="{x:Type bl:DragDockPanel}">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate>
                <Grid Margin="10">
                  <Grid Margin="5">
                    <Grid.RowDefinitions>
                      <RowDefinition Height="30"/>
                      <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Border Background="#00000000" Margin="-2" Padding="5" Grid.Row="0">
                      <Grid>
                        <Grid.ColumnDefinitions>
                          <ColumnDefinition Width="4*"/>
                          <ColumnDefinition Width="2*"/>
                        </Grid.ColumnDefinitions>
                        <WrapPanel>
                          <Image Width="20" x:Name="GripBarElement" Source="/Aisys.XStorage.Dashboard;component/Images/move.png" Grid.Column="0" Cursor="Hand" HorizontalAlignment="Left"/>
                          <TextBlock Text="{Binding Name}" Grid.Column="0" FontSize="16" FontWeight="Bold" Margin="10,0,0,0"/>
                        </WrapPanel>
                        <WrapPanel HorizontalAlignment="Right" Grid.Column="2">
                          <Button Command="{Binding ExecuteCommand}" CommandParameter="{Binding}" Margin="5,0,5,0">
                            <Button.Template>
                              <ControlTemplate>
                                <Image Source="/Aisys.XStorage.Dashboard;component/Images/Refresh.png"/>
                              </ControlTemplate>
                            </Button.Template>
                          </Button>
                          <Button Width="20" Command="{Binding DataContext.RemoveDiagramCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type bl:DragDockPanelHost}}}" CommandParameter="{Binding}">
                            <Button.Template>
                              <ControlTemplate>
                                <Image Source="/Aisys.XStorage.Dashboard;component/Images/Remove.png"/>
                              </ControlTemplate>
                            </Button.Template>
                          </Button>
                          <Button Command="{Binding DataContext.ShowPropertiesCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type bl:DragDockPanelHost}}}" CommandParameter="{Binding}" Margin="5,0,5,0">
                            <Button.Template>
                              <ControlTemplate>
                                <Image Source="/Aisys.XStorage.Dashboard;component/Images/Preferences.png"/>
                              </ControlTemplate>
                            </Button.Template>
                          </Button>
                          <ToggleButton x:Name="MaximizeToggleButton" VerticalAlignment="Top" HorizontalAlignment="Right" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Path=IsMaximized}" Margin="0,5,5,0" Width="25" Height="25" Cursor="Hand">
                            <ToggleButton.Template>
                              <ControlTemplate TargetType="ToggleButton">
                                <Image Source="/Aisys.XStorage.Dashboard;component/Images/Maximize.png" Margin="0,0,0,5"/>
                              </ControlTemplate>
                            </ToggleButton.Template>
                          </ToggleButton>
                        </WrapPanel>
                      </Grid>
                    </Border>
                    <Separator VerticalAlignment="Bottom" Margin="0,0,0,0"/>
                    <ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource elementTempSelector}" Grid.Row="1" Margin="10"/>
                  </Grid>
                </Grid>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </bl:DragDockPanelHost.DefaultPanelStyle>
    </bl:DragDockPanelHost>

图表的XAML:

  <Grid>
    <lvc:CartesianChart Series="{Binding Series}" LegendLocation="Right" Name="chart">
      <lvc:CartesianChart.AxisX>
        <lvc:Axis Title="Zeit" LabelFormatter="{Binding XFormatter}">
        </lvc:Axis>
      </lvc:CartesianChart.AxisX>
    </lvc:CartesianChart>
  </Grid>

如果我选择LineSeries,一切正常。但是,当我使用ColumnSeries时,什么也没显示。您会看到,轴已重画并且分隔符移动了。图例也已绘制,但没有可见的列。

有任何想法为什么会这样?

1 个答案:

答案 0 :(得分:0)

我最近有同样的问题。不幸的是,这似乎没有在任何地方得到记录,但是由于某种原因如果您的图表大小的数据点太多,那么将不会显示任何列。您可以尝试减少数据点的数量,直到它起作用为止(在我的情况下,将不显示90个数据点,但将显示30个),或者您可以将on ColumnSeries there is a property ColumnPadding降低为零,看看是否有帮助。 / p>