如何快速向WPF图表添加数据点

时间:2016-12-07 12:44:58

标签: c# wpf xaml animation charts

您好我有一个大型数据库,我可以从中获取1500个值,以便在图表中显示。

我的问题是显示所有点需要很长时间,我认为是因为动画设置。

如何更改动画的速度,还是有办法更快地显示点数?

<UserControl x:Class="Ipte.UI.Pages.StatisticsPage"
        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:gcl="clr-namespace:GuiControlLibrary;assembly=GuiControlLibrary"
        xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
             xmlns:time="clr-namespace:Ipte.UI"
        xmlns:chartToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
        mc:Ignorable="d"
        Height="800" Width="1200">
    <UserControl.Resources>
        <Style x:Key="Scater" TargetType="chartToolkit:ScatterDataPoint">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="chartToolkit:ScatterDataPoint">
                        <Viewbox x:Name="viewbox">
                            <!--<Ellipse Width="1" Height="1" Fill="Black"/>-->
                        </Viewbox>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Width" Value="4"/>
            <Setter Property="Height" Value="4"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid x:Name="filterGrid" Grid.Column="0" Margin="4">
            <StackPanel>
                <TextBlock Text="" Margin="2"/>
                <toolkit:DatePicker x:Name="dpStartDate" Margin="2" />
                <time:TimePicker x:Name="tpStartTime" Margin="2"/>             
                <TextBlock Text="End date &amp; time:" Margin="2"/>
                <toolkit:DatePicker x:Name="dpEndDate" Margin="2"/>
                <time:TimePicker x:Name="tpEndTime" Margin="2"/>

                <gcl:GuiGroupBox Header="Select router" BorderBrush="LightGray">
                    <UniformGrid Rows="2" Columns="2">
                        <CheckBox x:Name="cbEr11" Content="ER 1.1" Margin="2"/>
                        <CheckBox x:Name="cbEr12" Content="ER 1.2" Margin="2"/>
                        <CheckBox x:Name="cbEr21" Content="ER 2.1" Margin="2"/>
                        <CheckBox x:Name="cbEr22" Content="ER 2.1" Margin="2"/>
                    </UniformGrid>
                </gcl:GuiGroupBox>
                <TextBlock Text="" Margin="2"/>
                <ComboBox x:Name="cmbGoodBad" Margin="2"/>
                <TextBlock Text="" Margin="2"/>
                <TextBox x:Name="" Margin="2"/>
                <TextBlock Text="" Margin="2"/>
                <TextBox x:Name="" Margin="2"/>
                <gcl:GuiGroupBox Header="Select value" BorderBrush="LightGray">
                    <StackPanel>
                        <RadioButton x:Name="combValueA" Content="Value A" Margin="2"/>
                        <RadioButton x:Name="combValueB" Content="Value B" Margin="2"/>
                        <RadioButton x:Name="combValueC" Content="Value C" Margin="2"/>
                    </StackPanel>
                </gcl:GuiGroupBox>
                <Button x:Name="btnResetFilters" Content="Reset filters" Margin="2 10 2 2" Click="ResetFilters_Click"/>
                <Button x:Name="btnUpdateChart" Content="Update Chart" Margin="2 2 2 2" Click="UpdateChartAndFilters_Click"/>
                <Button x:Name="btnLoadFile" Content="Load file..." Grid.Column="0" VerticalAlignment="Top" Margin="2" Visibility="Visible" Click="OpenFile_Click"/>
            </StackPanel>
            <Button x:Name="deleteDatabase" Content="Delete database" Grid.Column="0" VerticalAlignment="Bottom" Margin="2" Click="deleteDatabase_Click"/>
        </Grid>
        <chartToolkit:Chart Grid.Column="1" x:Name="dataChart">
            <chartToolkit:Chart.Series>
                <chartToolkit:ScatterSeries x:Name="scatterSeries"
                                        ItemsSource="{Binding}"
                                        DependentValueBinding="{Binding Path=Value}"
                                        IndependentValueBinding="{Binding Path=Key}" 
                                        IsSelectionEnabled="False"
                                           AnimationSequence="Simultaneous">
                    <chartToolkit:ScatterSeries.IndependentAxis>
                        <chartToolkit:DateTimeAxis Orientation="X" Title="Time"/>
                    </chartToolkit:ScatterSeries.IndependentAxis>
                    <chartToolkit:ScatterSeries.DependentRangeAxis>
                        <chartToolkit:LinearAxis Orientation="Y" Title="Points" x:Name="yAxis"/>
                    </chartToolkit:ScatterSeries.DependentRangeAxis>
                </chartToolkit:ScatterSeries>
                <chartToolkit:LineSeries x:Name="lineSeriesMax"
                                         Title="Maximum"
                                         ItemsSource="{Binding}"
                                         DependentValueBinding="{Binding Path=Value}"
                                         IndependentValueBinding="{Binding Path=Key}">
                </chartToolkit:LineSeries>
                <chartToolkit:LineSeries x:Name="lineSeriesMin"
                                         Title="Minimum"
                                         ItemsSource="{Binding}"
                                         DependentValueBinding="{Binding Path=Value}"
                                         IndependentValueBinding="{Binding Path=Key}">
                </chartToolkit:LineSeries>
                <chartToolkit:LineSeries x:Name="lineSeriesAvg"
                                         Title="Average"
                                         ItemsSource="{Binding}"
                                         DependentValueBinding="{Binding Path=Value}"
                                         IndependentValueBinding="{Binding Path=Key}">
                </chartToolkit:LineSeries>
            </chartToolkit:Chart.Series>
        </chartToolkit:Chart>
    </Grid>
</UserControl>

这是我的积分显示方式:

Charting

3 个答案:

答案 0 :(得分:6)

我知道这是一个比较老的问题,但是我想分享我在WPF中进行图表绘制的想法,而不仅仅是绘制一些条形图或散点图或线。

也许每个人都同意库存WPF库不是构建的,并且打算在处理图表时处理成千上万个数据点。无论我尝试了什么变通方法,例如数据采样,我都从未真正对股票WPF图表功能感到满意。如果您不只是一次进行原型制作,还打算制作图表数据,我强烈建议您看一下专业的WPF图表库。

我特别多年来一直使用第三方供应商WPF库Scichart,对其功能的评价不够高。我经常绘制成千上万个图表,有时绘制成千上万个分散的数据点,最近还绘制了包含大量数据的3D图表,并发现Scichart的性能很高。它的成本超过了“免费”,但我发现投资值得,这是因为(而且我尝试将您的问题纳入此处):

  • 2D和3D库是坚如磐石,我的意思是渲染性能出色,绑定正常工作,几乎所有内容都可以自定义,完整的MVVM支持

  • 文档和支持论坛可能是Scichart提供的最好的部分。大多数问题,甚至棘手的问题都已得到解决,如果找不到某些问题,则其他用户或支持团队会及时答复。

  • 特别是对于您的问题,使用Scichart,您只需通过绑定或直接将所有数据集一次性添加为数组,即可在毫秒内呈现。如果您需要一个一个地添加数据点,它的实时功能也很棒。

我强烈建议您尝试一下,他们会提供试用许可证。我尝试使用DevExpress(我也拥有许可证)进行制图,并且其制图功能超越了几个数据点,并且它们的图表更适合于数据点很少的仪表板。我也尝试并使用过Arction's lightningchart库有一段时间,虽然原始性能与Scichart相当,但它们的样式绝对可怕,其MVVM功能几乎不存在,实际上,当您查看其文档时,您会发现很多针对问题的解决方案建议在后面的代码中显示。他们的支持论坛和Q&A存储库也非常稀少,这通常确实使我感到沮丧,因为每个开发人员有时都会遇到他/她需要寻找解决方案的问题。

说实话,如果您只希望绘制1500个数据点并拥有DevExpress许可证,那么就一定要使用它们,因为我认为它们仍然可以处理1500个点,尽管可能会更棘手。但是,如果您发现需要更大的数据集的图表功能,那么我对Scichart的评价还不够高。为什么?因为我从1.3.x.xxxx早期版本开始就使用该库。我真的相信它们是WPF空间中最好的图表库。

答案 1 :(得分:2)

此帖子已由其所有者自愿删除。

答案 2 :(得分:0)

如果您的主要优先级是折线图,并且您考虑切换到第三方组件供应商,则可以考虑将DevExpress ChartControl作为合适的选项。

例如,最新版本的DevExpress组件随附“大型数据源”演示模块,其中最多可以显示500K点,而不会显着降低性能(这包括滚动和缩放等交互式操作)。