如何同步2个Oxyplot图形?

时间:2018-02-24 11:39:54

标签: wpf prism oxyplot

我有一个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个图形,并且图形的创建顺序可能会有所不同。因此,我认为我不能将一个图表视为主要图表,并让所有其他图表都遵循此图表。

对此的任何想法都将非常感激!

1 个答案:

答案 0 :(得分:0)

最近,我遇到了类似的问题。我在一个图中有多个平行轴,并且在用户缩放或平移它们时需要它们同步。 Oxyplot团队尚未实现此功能(请参阅:https://github.com/oxyplot/oxyplot/issues/86https://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方式美化该解决方案。