2016-11-29 30 views
0

沿着我剛開始探索然而現場圖表庫似乎無法得到x軸更新隨着時間的推移。我經歷了這麼多次,似乎無法找到問題所在。數據點正確更新,這是我發現如此混亂!「活圖表」 x軸不更新隨着時間的推移WPF C#

,我會在以後的日子與顯示多長時間測試已經進行,而不是運行一個計時器更換日期時間,如果這使得該解決方案的任何簡單?我的

部分認爲這一定是一些簡單的我失蹤!?

我很欣賞這一個任何幫助!

public partial class MainWindow : Window 
{ 

    private double _axisMax; 
    private double _axisMin; 
    Stopwatch stopwatch = new Stopwatch(); 


    public MainWindow() 
    { 
     InitializeComponent(); 
     //To handle live data easily, in this case we built a specialized type 
     //the MeasureModel class, it only contains 2 properties 
     //DateTime and Value 
     //We need to configure LiveCharts to handle MeasureModel class 
     //The next code configures MEasureModel globally, this means 
     //that livecharts learns to plot MeasureModel and will use this config every time 
     //a ChartValues instance uses this type. 
     //this code ideally should only run once, when application starts is reccomended. 
     //you can configure series in many ways, learn more at http://lvcharts.net/App/examples/v1/wpf/Types%20and%20Configuration 


     var mapper = Mappers.Xy<MeasureModel>() 
      .X(model => model.DateTime.Ticks) //use DateTime.Ticks as X 
      .Y(model => model.Value);   //use the value property as Y 

     //lets save the mapper globally. 
     Charting.For<MeasureModel>(mapper); 


     //the values property will store our values array 
     ChartValues = new ChartValues<MeasureModel>(); 

     //lets set how to display the X Labels 
     DateTimeFormatter = value => new DateTime((long)value).ToString("hh:mm:ss"); 

     AxisStep = TimeSpan.FromSeconds(1).Ticks; 
     SetAxisLimits(DateTime.Now); 

     //The next code simulates data changes every 300 ms 
     Timer = new DispatcherTimer 
     { 
      Interval = TimeSpan.FromMilliseconds(300) 
     }; 
     Timer.Tick += TimerOnTick; 
     IsDataInjectionRunning = false; 
     R = new Random(); 
     DataContext = this; 
    } 

    public ChartValues<MeasureModel> ChartValues { get; set; } 
    public Func<double, string> DateTimeFormatter { get; set; } 

    public double AxisStep { get; set; } 

    public double AxisMax 
    { 
     get { return _axisMax; } 
     set 
     { 
      _axisMax = value; 
      OnPropertyChanged("AxisMax"); 
     } 
    } 
    public double AxisMin 
    { 
     get { return _axisMin; } 
     set 
     { 
      _axisMin = value; 
      OnPropertyChanged("AxisMin"); 
     } 
    } 

    public DispatcherTimer Timer { get; set; } 
    public bool IsDataInjectionRunning { get; set; } 
    public Random R { get; set; } 

    private void RunDataOnClick(object sender, RoutedEventArgs e) 
    { 
     if (IsDataInjectionRunning) 
     { 
      stopwatch.Stop(); 
      Timer.Stop(); 
      IsDataInjectionRunning = false; 
     } 
     else 
     { 
      stopwatch.Start(); 
      Timer.Start(); 
      IsDataInjectionRunning = true; 
     } 
    } 

    private void TimerOnTick(object sender, EventArgs eventArgs) // Class is referencing from here! 
    { 
     var now = DateTime.Now; 

     ChartValues.Add(new MeasureModel 
     { 
      DateTime = DateTime.Now, 
      Value = R.Next(0, 10) 
     }); 

     SetAxisLimits(DateTime.Now); 

     //lets only use the last 30 values 
     if (ChartValues.Count > 30) ChartValues.RemoveAt(0); 
    } 

    private void SetAxisLimits(DateTime now) 
    { 
     AxisMax = now.Ticks + TimeSpan.FromSeconds(20).Ticks; // lets force the axis to be 100ms ahead 
     AxisMin = now.Ticks - TimeSpan.FromSeconds(8).Ticks; //we only care about the last 8 seconds 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName = null) 
    { 
     if (PropertyChanged != null) // if subrscribed to event 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class MeasureModel 
{ 
    public DateTime DateTime { get; set; } 
    public double Value { get; set; } 
} 

<Window 
    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:local="clr-namespace:graph_test_6" 
    xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" 
    xmlns:chart="http://mindfusion.eu/charting/wpf" x:Class="graph_test_6.MainWindow" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Button Grid.Row="0" Height="30" Click="RunDataOnClick"> 
     Inject/Stop Data 
    </Button> 
    <lvc:CartesianChart Grid.Row="1"> 
     <lvc:CartesianChart.Series> 
      <lvc:LineSeries Values="{Binding ChartValues}" PointGeometrySize="18" StrokeThickness="4" /> 
     </lvc:CartesianChart.Series> 
     <lvc:CartesianChart.AxisX> 
      <lvc:Axis LabelFormatter="{Binding DateTimeFormatter}" 
         MaxValue="{Binding AxisMax}" 
         MinValue="{Binding AxisMin}" 
         DisableAnimations="True"> 
       <lvc:Axis.Separator> 
        <lvc:Separator Step="{Binding AxisStep}"></lvc:Separator> 
       </lvc:Axis.Separator> 
      </lvc:Axis> 
     </lvc:CartesianChart.AxisX> 
    </lvc:CartesianChart> 
    <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="323,-71,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/> 
</Grid> 

Screen shot of problem

+0

@ 3615,我相信最新的一個。我下載了它從這裏... https://lvcharts.net/App/examples/v1/wpf/Install 感謝 – charley

+0

好吧,但有從[這裏]任何區別(https://lvcharts.net/App/實例/ V1/WPF /恆%20Changes)?您發佈的代碼似乎與網站上的示例相同。我目前正在github上運行最新版本的源代碼,它似乎工作正常。 – 3615

+0

還使用您的代碼創建了一個新的wpf應用程序,以確保與示例源的所有差異都考慮在內:[它正在運行](http://screencast.com/t/fLers3IbW)。或者,也許我不明白你的問題。 – 3615

回答

2

在XAML您是AxisX性質的MaxValue和MINVALUE結合:

MaxValue="{Binding AxisMax}" 
MinValue="{Binding AxisMin}" 

當窗口加載WPF機制讀取綁定的值:這就是你如何爲X軸獲得初始值。後來在代碼要更改這些值:

AxisMax = now.Ticks + TimeSpan.FromSeconds(20).Ticks; // lets force the axis to be 100ms ahead 
AxisMin = now.Ticks - TimeSpan.FromSeconds(8).Ticks; //we only care about the last 8 seconds 

的XAML應該通知這些變化,它的通過完成:

OnPropertyChanged("AxisMin"); 
OnPropertyChanged("AxisMax"); 

的問題是,窗口控件本身並沒有聲明,它支持更改通知:缺少INotifyPropertyChanged

因此,要解決您的問題變化

public partial class MainWindow : Window 

public partial class MainWindow : Window, INotifyPropertyChanged 
+0

完美!非常感謝!現在嘗試繪製時間而不是日期時間:) – charley

相關問題