我正在做一個基於WPF圖表工具包的應用程序實時數據製圖。我通過串口獲取數據。 設置圖表的代碼如下:WPF圖表工具包:如何設置固定的X軸範圍,同時添加實時數據
<chartingToolkit:Chart Margin="10,10,10,0" ClipToBounds="True" x:Name="chart1" Title="Chart Title">
<chartingToolkit:LineSeries IndependentValueBinding="{Binding Value1}" DependentValueBinding="{Binding Value2}" ItemsSource="{Binding}" Background="Transparent" Cursor="No">
<chartingToolkit:LineSeries.DataPointStyle>
<Style TargetType="{x:Type chartingToolkit:LineDataPoint}">
<Setter Property="Height" Value="0"/>
<Setter Property="Width" Value="0" />
<Setter Property="Background" Value="Green"/>
</Style>
</chartingToolkit:LineSeries.DataPointStyle>
</chartingToolkit:LineSeries>
</chartingToolkit:Chart>
它的工作不錯,但我仍然需要設置X軸的最大值和最小值。 X值(Value1)是接收採樣的數量,並且Y軸值(Value2)顯然是接收採樣的具體值。
我的問題是關於X軸範圍。
目前,我得到的最小值爲0和maximinum作爲串口在當前時刻接收的最高採樣數。
但我想設置一個我想看到的X軸的永久性範圍。
例如,我想查看500個樣本的X軸範圍。
這意味着當樣本數量超過500時,最大值應該是最高採樣數,最小值應該是max-500。
主要困難在於如何在WPF中設置實時數據?
任何人都可以幫助我嗎?
更新問題
我@jstreet提醒後更新我的問題。
我有這種方法在MainWindow類中的單獨線程中運行,如下所示。
public partial class MainWindow : Window
{
public SerialPort serialPort1 = new SerialPort();
public string rx_str = "";
public string rx_str_copy;
public int a;
public double x, y;
ObservableCollection<ChartData> chartData;
ChartData objChartData;
Thread myThread;
public MainWindow()
{
InitializeComponent();
string[] port = SerialPort.GetPortNames();
foreach (string a in port)
{
comboPorts.Items.Add(a);
}
Array.Sort(port);
comboPorts.Text = port[0];
objChartData = new ChartData();
chartData.Add(objChartData);
chart1.DataContext = chartData;
myThread = new Thread(new ThreadStart(Run));
}
public void Run()
{
while (true)
{
serialPort1.Write("a");
rx_str = serialPort1.ReadTo("b");
rx_str_copy = rx_str;
x = a;
y = Double.Parse(rx_str_copy, CultureInfo.InvariantCulture);
a++;
Dispatcher.Invoke(new Action(delegate
{
chartData.Add(new ChartData() { Value1 = x,
Value2= y });
}));
}
}
此Run()方法負責接收數據並將其添加到圖表中。
在另一類我正在添加上DATAS和設置屬性Valeu1和值2反應的手柄:
public class ChartData : INotifyPropertyChanged
{
double _Value1;
double _Value2;
public double Value1
{
get
{
return _Value1;
}
set
{
_Value1 = value;
OnPropertyChanged("Value1");
}
}
public double Value2
{
get
{
return _Value2;
}
set
{
_Value2 = value;
OnPropertyChanged("Value2");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new
PropertyChangedEventArgs(propertyName));
}
}
}
我如何能適應@ jstreet的背後的代碼示例解決我?
jstreet,感謝您的答覆是有益的,但現在我strugg讓您的解決方案適應我的代碼。 我已經更新了我上面的問題。 jstreet,請再次看看並給出任何建議? –
請參閱我的**編輯**。 – jsanalytics
謝謝,夥計!這是我想要的。它工作得很好!順便說一句,你是如何學習WPF的?什麼資源,以什麼方式? –