Oxyplot WPF 中的水平滚动条
Horizontal Scroll Bar in Oxyplot WPF
我正在尝试实现一个实用程序来显示系统中随时间变化的吞吐量,并使用 Oxyplot 可视化数据。
目前,缩放和平移按预期工作,但我希望向用户提供一些视觉指示,清楚地显示图形是否可以缩放或平移。
在放弃使用滚动条的想法后(既不能准确获取图表可见部分的位置,也不能正确定位滚动条相对于图表的拇指),我决定了使用图标显示图表上是否有隐藏在左侧或最右侧的数据。
我希望这些图标用作允许用户在图表上左右翻页的按钮,但是与 OxyPlot 相关的所有内容一样,实现远比乍看起来复杂得多。
我正在使用 WPF 实现,它使用表示整个数据集的 ViewModel,每个系列项目由其自己的模型表示。
这实际上使几乎所有教程都变得无用,因为 WPF 实现与基本的 OxyPlot 包有很大不同。
目前,视图中的代码处理页面 left/right 按钮上的点击。我不能把它放在我的 ViewModel 中,因为它必须直接与 PlotControl 对象交互。
private void btnPageRight_Click(object sender, RoutedEventArgs e) {
CategoryAxis axis = (CategoryAxis)PlotControl.ActualModel.Axes[0];
double xAxisMin = axis.ActualMinimum;
double xAxisMax = axis.ActualMaximum;
double visibleSpan = xAxisMax - xAxisMin;
double newMinOffset = xAxisMax + visibleSpan;
PlotControl.Axes[0].Minimum = newMinOffset;
PlotControl.Axes[0].Maximum = newMinOffset + visibleSpan;
PlotControl.ActualModel.InvalidatePlot(true);
}
就目前而言,上面的代码没有抛出任何错误,但它也不起作用。
如果有人可以建议一种可能的方法,使 OxyPlot 仅使用后面的代码滚动到给定位置,我将不胜感激。
作为最后的手段,我一直在考虑尝试模拟鼠标拖动事件来让这个挑剔的野兽表现出来。
我发现需要以这种方式解决问题非常令人反感,但绝望会导致奇怪的解决方案...
万一其他人 运行 遇到此问题,以下代码段将根据图表上当时可见的列数在页面中滚动图表。
该代码段将可见列数作为视口,并将可见区域按视口大小移动。
尽管这适用于 WPF 实现,但我能找到的唯一方法是 运行 从包含 OxyPlot
图表的视图后面的代码中使用此方法。
无论当时的缩放量如何,这都应该可以正常工作。
必须从 ActualModel
获取 CategoryAxis
参考,因为 WPF.Axis
不提供计算可视区域所需的 ActualMinumum
和 ActualMaximum
.
本例中的 visibleSpan
表示列数,panStep
表示平移的像素数。
private void ScrollInPages() {
//To zoom on the X axis.
CategoryAxis axis = (CategoryAxis)PlotControl.ActualModel.Axes[0];
double visibleSpan = axis.ActualMaximum - axis.ActualMinimum;
double panStep = 0;
//Scrolling the chart - comment out as appropriate
//Scroll right one page
panStep = axis.Transform(0 - (axis.Offset + visibleSpan));
//Scroll left one page
panStep = axis.Transform(axis.Offset + visibleSpan);
axis.Pan(panStep);
PlotControl.InvalidateFlag++;
}
我正在尝试实现一个实用程序来显示系统中随时间变化的吞吐量,并使用 Oxyplot 可视化数据。
目前,缩放和平移按预期工作,但我希望向用户提供一些视觉指示,清楚地显示图形是否可以缩放或平移。
在放弃使用滚动条的想法后(既不能准确获取图表可见部分的位置,也不能正确定位滚动条相对于图表的拇指),我决定了使用图标显示图表上是否有隐藏在左侧或最右侧的数据。
我希望这些图标用作允许用户在图表上左右翻页的按钮,但是与 OxyPlot 相关的所有内容一样,实现远比乍看起来复杂得多。
我正在使用 WPF 实现,它使用表示整个数据集的 ViewModel,每个系列项目由其自己的模型表示。 这实际上使几乎所有教程都变得无用,因为 WPF 实现与基本的 OxyPlot 包有很大不同。
目前,视图中的代码处理页面 left/right 按钮上的点击。我不能把它放在我的 ViewModel 中,因为它必须直接与 PlotControl 对象交互。
private void btnPageRight_Click(object sender, RoutedEventArgs e) {
CategoryAxis axis = (CategoryAxis)PlotControl.ActualModel.Axes[0];
double xAxisMin = axis.ActualMinimum;
double xAxisMax = axis.ActualMaximum;
double visibleSpan = xAxisMax - xAxisMin;
double newMinOffset = xAxisMax + visibleSpan;
PlotControl.Axes[0].Minimum = newMinOffset;
PlotControl.Axes[0].Maximum = newMinOffset + visibleSpan;
PlotControl.ActualModel.InvalidatePlot(true);
}
就目前而言,上面的代码没有抛出任何错误,但它也不起作用。
如果有人可以建议一种可能的方法,使 OxyPlot 仅使用后面的代码滚动到给定位置,我将不胜感激。 作为最后的手段,我一直在考虑尝试模拟鼠标拖动事件来让这个挑剔的野兽表现出来。
我发现需要以这种方式解决问题非常令人反感,但绝望会导致奇怪的解决方案...
万一其他人 运行 遇到此问题,以下代码段将根据图表上当时可见的列数在页面中滚动图表。
该代码段将可见列数作为视口,并将可见区域按视口大小移动。
尽管这适用于 WPF 实现,但我能找到的唯一方法是 运行 从包含 OxyPlot
图表的视图后面的代码中使用此方法。
无论当时的缩放量如何,这都应该可以正常工作。
必须从 ActualModel
获取 CategoryAxis
参考,因为 WPF.Axis
不提供计算可视区域所需的 ActualMinumum
和 ActualMaximum
.
本例中的 visibleSpan
表示列数,panStep
表示平移的像素数。
private void ScrollInPages() {
//To zoom on the X axis.
CategoryAxis axis = (CategoryAxis)PlotControl.ActualModel.Axes[0];
double visibleSpan = axis.ActualMaximum - axis.ActualMinimum;
double panStep = 0;
//Scrolling the chart - comment out as appropriate
//Scroll right one page
panStep = axis.Transform(0 - (axis.Offset + visibleSpan));
//Scroll left one page
panStep = axis.Transform(axis.Offset + visibleSpan);
axis.Pan(panStep);
PlotControl.InvalidateFlag++;
}