我有一个WPF应用程序,用于显示我使用Oxyplot创建的2个图形。这两个图都是独立的 - 它们有自己的视图和ViewModel,并从不同的源接收数据。
UserControl
|
|--- ContentControl
| |
| |--- ViewA (Contains 1 graph) --- ViewModelA --- SourceA
|
|
|--- ContentControl
|
|--- ViewB (Contains another graph) --- ViewModelB --- SourceB
当ViewModelA从SourceA接收数据时,我将数据添加到Series,然后调用Model.InvalidatePlot(true)。 ViewModelB和SourceB也是如此。
两个图表的数据之间唯一共同点是时间。 SourceA和SourceB发送的数据可能只有几毫秒到几秒间隔。
所以这就是我需要实现的目标 - 如何确保两个图的DateTimeAxis始终同步?在任何给定的时间点,我需要在两个图的X轴上显示相同的最小值和相同的最大值。
我遇到过AxisChanged事件,我可以使用1图表中的事件,并在另一个图表上设置相同的值。但就我而言,我不确定如何使用它,因为我的图表是在不同的类中。此外,我所描述的情况非常简单。在应用程序的生命周期中,我最多可能会得到9个图形,并且图形的创建顺序可能会有所不同。因此,我认为我不能将一个图表视为主要图表,并让所有其他图表都遵循此图表。
对此的任何想法都将非常感激!
答案 0 :(得分:0)
最近,我遇到了类似的问题。我在一个图中有多个平行轴,并且在用户缩放或平移它们时需要它们同步。 Oxyplot团队尚未实现此功能(请参阅:https://github.com/oxyplot/oxyplot/issues/86,https://github.com/oxyplot/oxyplot/issues/59)。但是有一个相当简单的解决方法: 您需要将一个轴作为主轴,并更新另一个轴,例如:
AxisT.AxisChanged += AxisT_AxisChanged;
private void AxisT_AxisChanged(object sender, AxisChangedEventArgs e)
{
switch (e.ChangeType) {
case AxisChangeTypes.Reset:
AxisD.Reset();
break;
case AxisChangeTypes.Zoom:
case AxisChangeTypes.Pan:
AxisD.AbsoluteMinimum = AxisT.ActualMinimum;
AxisD.AbsoluteMaximum = AxisT.ActualMaximum;
AxisD.Minimum = AxisT.ActualMinimum;
AxisD.Maximum = AxisT.ActualMaximum;
break;
}
}
在这种方法中,相同图或不同图中的轴没有区别。如果您在轴上有不同的比例,则应用比例比,例如AxisD.AbsoluteMinimum = AxisT.ActualMinimum * ratio;
AxisChangedEventArgs包含DeltaMinimum和DeltaMaximum值,但是我没有找到轻松将它们应用于其他轴的方法,因此仅使用ActualMinimum和ActualMaximum值更为简单。
实际上,您可以为另一个轴设置相同的处理程序,只需确保在两次设置相同的值时更新循环就停止。
@jsanalytics的评论使您可以通过MVVM方式美化该解决方案。