首页 文章

Oxyplot WPF中的水平滚动条

提问于
浏览
1

我正在尝试实现一个实用程序,用于显示系统中的吞吐量,并使用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滚动到给定位置,我将不胜感激 . 作为最后的手段,我一直在考虑尝试模拟鼠标拖动事件以使这个挑剔的野兽表现出来 .

我发现以这种方式解决这个问题的必要性非常令人反感,但是解散导致奇怪的解决方案......

1 回答

  • 0

    如果其他人遇到此问题,以下代码段将根据当时图表上可见的列数滚动页面中的图表 .

    该片段将可见列的数量作为视口,并将按视口大小移动可见区域 .

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

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

    必须从 ActualModel 获取 CategoryAxis 引用,因为 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++;
        }
    

相关问题