检索当前显示的数据间隔
Retrieve interval of data currently shown
我正在使用 OxyPlot 来显示数据图表并允许用户select他想要计算的数据区间。
看起来像这样:
现在,我希望用户能够通过调整图表大小自行设置用于计算的数据间隔。例如,如果他在此特定时间间隔内调整图表的大小,它只会采用屏幕上最左边和最右边之间的点。
我已经找到每当调整图表大小时触发的事件:
plotModel.Updated += (s, e) =>
{
//reset interval used for calculation
};
我在 OxyPlot 文档中找不到的是检索当前显示的一组特定点的方法。不需要特别点,我也可以只用每个极值的x分量。
您可以在使用 Transform()
方法转换您的点后使用 Series.GetScreenRectangle().Contains()
方法来检测该点当前是否在显示中。
例如,
model.Updated += (s,e)=>
{
if(s is PlotModel plotModel)
{
var series = plotModel.Series.OfType<OxyPlot.Series.LineSeries>().Single();
var pointCurrentlyInDisplay = new List<DataPoint>();
foreach (var point in series.ItemsSource.OfType<DataPoint>())
{
if (series.GetScreenRectangle().Contains(series.Transform(point)))
{
pointCurrentlyInDisplay.Add(point);
}
}
}
};
您正在迭代点集合并验证转换点(转换方法将数据点转换为屏幕点)是否落在系列使用的屏幕矩形内。
更新
如果您使用 Series.Points.AddRange()/Add() 而不是 Series.ItemSource 添加点,请使用以下方法检索点。
foreach (var point in series.Points.OfType<DataPoint>())
{
if (series.GetScreenRectangle().Contains(series.Transform(point)))
{
pointCurrentlyInDisplay.Add(point);
}
}
我正在使用 OxyPlot 来显示数据图表并允许用户select他想要计算的数据区间。
看起来像这样:
现在,我希望用户能够通过调整图表大小自行设置用于计算的数据间隔。例如,如果他在此特定时间间隔内调整图表的大小,它只会采用屏幕上最左边和最右边之间的点。
我已经找到每当调整图表大小时触发的事件:
plotModel.Updated += (s, e) =>
{
//reset interval used for calculation
};
我在 OxyPlot 文档中找不到的是检索当前显示的一组特定点的方法。不需要特别点,我也可以只用每个极值的x分量。
您可以在使用 Transform()
方法转换您的点后使用 Series.GetScreenRectangle().Contains()
方法来检测该点当前是否在显示中。
例如,
model.Updated += (s,e)=>
{
if(s is PlotModel plotModel)
{
var series = plotModel.Series.OfType<OxyPlot.Series.LineSeries>().Single();
var pointCurrentlyInDisplay = new List<DataPoint>();
foreach (var point in series.ItemsSource.OfType<DataPoint>())
{
if (series.GetScreenRectangle().Contains(series.Transform(point)))
{
pointCurrentlyInDisplay.Add(point);
}
}
}
};
您正在迭代点集合并验证转换点(转换方法将数据点转换为屏幕点)是否落在系列使用的屏幕矩形内。
更新
如果您使用 Series.Points.AddRange()/Add() 而不是 Series.ItemSource 添加点,请使用以下方法检索点。
foreach (var point in series.Points.OfType<DataPoint>())
{
if (series.GetScreenRectangle().Contains(series.Transform(point)))
{
pointCurrentlyInDisplay.Add(point);
}
}