设置键/鼠标事件后关闭OxyPlot PlotView的max/min

本文关键字:PlotView OxyPlot max min 鼠标 事件 设置 | 更新日期: 2023-09-27 18:10:30

我有一个Wpf应用程序,它显示了一个plotview,也有一个按钮,调用一个函数,根据其数据自动缩放情节。我遇到的问题是,如果我使用键盘或鼠标与plotview进行交互以平移/缩放,我的自动缩放按钮,它只是设置轴的最大值和最小值,不会导致plotview明显改变。我已经确认在对象本身中修改了最大值/最小值,但是这些更改没有显示在plotview中。

public class ViewModel
{
    public const int maxSamples = 45000;
    public ViewModel()
    {
        this.PlotModel = new PlotModel();
        // the x-axis
        this.PlotModel.Axes.Add(new OxyPlot.Axes.LinearAxis { 
                Position = OxyPlot.Axes.AxisPosition.Bottom, 
                AbsoluteMinimum = 0, 
                AbsoluteMaximum = maxSamples,
                Minimum = 0,
                Maximum = maxSamples
            });
        // the y-axis
        this.PlotModel.Axes.Add(new OxyPlot.Axes.LinearAxis { 
                Position = OxyPlot.Axes.AxisPosition.Left, 
                Minimum = -100, 
                Maximum = 200 
            });
    }
    public PlotModel Ch1Model { get; private set; }
    public void AutoZoom()
    {
        double max;
        double min;
        // some code to determine the max/min values for the y-axis
        // ...
        ((LinearAxis)PlotModel.Axes[1]).Maximum = max;
        ((LinearAxis)PlotModel.Axes[1]).Minimum = min;
        PlotModel.InvalidatePlot(true);
    }
}

再次,调用AutoZoom()工作,直到我使用鼠标/键盘与plotview交互,然后AutoZoom设置轴上的Max/Min值,但显示不更新。你知道我哪里做错了吗?

设置键/鼠标事件后关闭OxyPlot PlotView的max/min

我知道这个问题已经有一段时间没有答案了,但是当我遇到同样的问题时,我发现它仍然是相关的。

Axis对象内部,有一个初始化为double.NaNViewMinimumViewMaximum。一旦你用鼠标进行平移、缩放等操作,这些值就会被设置为平移/缩放操作结束时的值。在Axis对象的任何后续重绘中,这些值将优先于MinimumMaximum

为了让PlotView跟随指定的MinimumMaximum,您必须通过调用其Reset()方法来重置轴,然后将值赋给MinimumMaximum。还要注意,一旦设置了MinimumMaximum,如果将PlotType设置为Cartesian, OxyPlot将在X轴和Y轴上使用相同的缩放。如果不需要,请将ModelPlotType设置为PlotType.XY

例如:

public void AutoZoom()
{
    double max;
    double min;
    // some code to determine the max/min values for the y-axis
    // ...
    PlotModel.Axes[1].Reset(); //Reset the axis to clear ViewMinimum and ViewMaximum
    ((LinearAxis)PlotModel.Axes[1]).Maximum = max;
    ((LinearAxis)PlotModel.Axes[1]).Minimum = min;
    PlotModel.InvalidatePlot(true);
}