2016-12-07 57 views
2

你好,我有一个大的数据库,我从哪里拿到1500个值,以便在图表中显示。如何将数据点快速添加到WPF图表

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

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

<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

+0

你能提供你的数据绑定工作方式(viewmodel等),以及如何填充你的数据吗? – TripleEEE

+0

从Sqllite数据库中获取数据,并将其放入4 ObservableCollection >以显示它 – thiseful

+0

您是否使用'.Add(x)'添加数据或者是否使用'.AddRange (名单)'?我认为'ObservableCollection'会在每一个添加的点上抛出一个'CollectionChangedEvent'(订阅并测试这个!),这会导致渲染操作 - 如果发生这种情况,您应该停用这个信息(派生并且通过布尔标记来暂停Eventcall)最后一个项目的信息添加。 – TripleEEE

回答

1

什么最有助于图表放缓是产生提请一系列逐点的所有事件,他们被添加到视图模型集合中。如果把它们一下子解决了这个问题:

enter image description here

扩展ObservableCollection支持AddRange,如图所示HERE

public class ObservableCollectionRange<T> : ObservableCollection<T> 
{ 
    public void AddRange(IEnumerable<T> items) 
    { 
     this.CheckReentrancy(); 
     foreach (var item in items) 
      this.Items.Add(item); 
     this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
    } 
} 

然后在您的视图模型中使用它:

public class MyViewModel 
{ 
    public ObservableCollectionRange<KeyValuePair<double, double>> Power { get; set; } 
    public ObservableCollectionRange<KeyValuePair<double, double>> PowerAvg { get; set; } 

    public MyViewModel() 
    { 
     Power = new ObservableCollectionRange<KeyValuePair<double, double>>(); 
     PowerAvg = new ObservableCollectionRange<KeyValuePair<double, double>>(); 
    } 

    public void Add(double x, double y) 
    { 
     Power.Add(new KeyValuePair<double, double>(x, y)); 

     double xmin = Power.Min(kvp => kvp.Key); 
     double xmax = Power.Max(kvp => kvp.Key); 

     double ymin = Power.Min(kvp => kvp.Value); 
     double ymax = Power.Max(kvp => kvp.Value); 
     double yavg = Power.Average(kvp => kvp.Value); 

     PowerAvg.Clear(); 
     PowerAvg.Add(new KeyValuePair<double, double>(xmin, yavg)); 
     PowerAvg.Add(new KeyValuePair<double, double>(xmax, yavg)); 
    } 

    public void AddRange(IEnumerable<KeyValuePair<double, double>> items) 
    { 
     Power.AddRange(items); 

     double xmin = Power.Min(kvp => kvp.Key); 
     double xmax = Power.Max(kvp => kvp.Key); 

     double ymin = Power.Min(kvp => kvp.Value); 
     double ymax = Power.Max(kvp => kvp.Value); 
     double yavg = Power.Average(kvp => kvp.Value); 

     PowerAvg.Clear(); 
     PowerAvg.Add(new KeyValuePair<double, double>(xmin, yavg)); 
     PowerAvg.Add(new KeyValuePair<double, double>(xmax, yavg)); 
    } 
} 

而在按钮点击事件:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ShowPoints(); 
    } 

    private void ShowPoints() 
    { 
     Random random = new Random(); 
     ObservableCollection<KeyValuePair<double, double>> oc = new ObservableCollection<KeyValuePair<double, double>>(); 

     for (int i = 1; i <= 1500; i++) 
      oc.Add(new KeyValuePair<double, double>(i, random.NextDouble())); 

     vm.AddRange(oc); 
    } 
+0

列表中最后添加的项目再次感谢!!! :) – thiseful

+0

不受欢迎的一如既往。 – jsanalytics