【问题标题】:Horizontal Scroll Bar in Oxyplot WPFOxyplot WPF 中的水平滚动条
【发布时间】:2017-07-11 11:37:30
【问题描述】:

我正在尝试实现一个实用程序来显示系统中随时间变化的吞吐量,并且正在使用 Oxyplot 来可视化数据。

目前,缩放和平移正在按预期工作,但我希望向用户提供一些视觉指示,清楚地显示图形是否可以缩放或平移。

放弃使用滚动条的想法(既不能准确获得图表可见部分的位置,也不能正确定位相对于图表的滚动条的拇指),我决定使用图标显示图表上是否有隐藏在左侧或右侧的数据。

我希望这些图标用作允许用户在图表上左右翻页的按钮,但是与 OxyPlot 相关的所有内容一样,实现比最初看起来要复杂得多。

我正在使用 WPF 实现,它使用一个 ViewModel 表示整个数据集,每个系列项目由它自己的模型表示。 由于 WPF 实现与基本的 OxyPlot 包有很大不同,因此这有效地使几乎所有教程都变得毫无用处。

目前,视图中的代码处理页面左/右按钮的点击。我不能把它放在我的 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 仅使用后面的代码滚动到给定位置,我将不胜感激。 作为最后的手段,我考虑过尝试模拟鼠标拖动事件以使这个挑剔的野兽表现出来。

我发现需要以这种方式解决问题非常令人反感,但绝望会导致奇怪的解决方案......

【问题讨论】:

    标签: c# wpf oxyplot


    【解决方案1】:

    如果其他人遇到此问题,以下 sn-p 将根据当时图表上可见的列数在页面中滚动图表。

    sn-p 以可见列数作为视口,将可见区域移动视口大小。

    虽然这适用于 WPF 实现,但我能找到的唯一方法是从包含 OxyPlot 图表的视图后面的代码中运行此方法。

    无论当时的缩放量如何,这应该都能正常工作。

    CategoryAxis 引用必须从ActualModel 获得,因为WPF.Axis 不提供计算可视区域所需的ActualMinumumActualMaximum

    在这种情况下,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++;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2023-03-20
      • 2012-09-16
      相关资源
      最近更新 更多