首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LiveCharts ColumnSeries未显示

LiveCharts ColumnSeries未显示
EN

Stack Overflow用户
提问于 2019-01-12 17:49:11
回答 1查看 2K关注 0票数 1

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

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

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

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

填写SeriesCollection:

代码语言:javascript
复制
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);
            }
        }
    }
}

Mapper和AxisFormatter:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
  <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:

代码语言:javascript
复制
  <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时,没有显示任何内容。你可以看到,轴被重画,分隔符移动。还绘制了图例,但没有可见的列。

知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2019-06-05 02:51:54

我最近也有同样的问题。不幸的是,这似乎没有被记录在任何地方,但是出于某种原因,--如果您有太多的数据点来表示图的大小,那么所有的列都不会显示。您可以尝试减少数据点的数量,直到它工作为止(在我的例子中,90个数据点不会显示,而30个数据点会显示),或者可以将数据点的数量降到零,看看这是否有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54162314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档