2016-12-07 6 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データベースから取得され、それを表示するためにObservableCollection >に格納されます – thiseful

+0

データを '.Add(x)'で追加するのか、 '.AddRange (リスト) '?私は 'ObservableCollection'がレンダリングの操作につながるすべてのポイントで' CollectionChangedEvent'(サブスクリプションとテスト!)をスローすると思います。もしこれが起こるならば、この情報を無効にして(ブールフラグでEventcallを派生させてください)最後の項目に関する情報が追加されました。 – TripleEEE

答えて

1

があなたのシリーズポイントごとなどを描画するために生成されたすべてのイベントで彼らビューモデルコレクションに追加されます。一度にすべてを追加すると、その問題を解決:

enter image description here

HEREを示すように、AddRangeをサポートするためにObservableCollectionを拡張:その後、

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

関連する問題