我有一个带有一些数据的 telerik RadChartView,我的 X 轴是 DateTimeContinuousAxis,我的 Y 轴是 LinearAxis。 此 RadChartView 有一个缩放按钮,它使用 LassoZoomController 方法进行缩放。 我面临一个问题,在放大或缩小之后,我想获得用户可以在缩放中看到的可见点(忽略缩放中不可见的点)。 有没有办法在缩放后只获取图表中可见的点?
在下面的代码中,我想进行验证以将日期时间添加到列表中,前提是它在我的 radChartView 中可见
var categoricalDataPoints = radChartView.Series.Where(serie => serie.IsVisible).SelectMany(serie => serie.DataPoints)
.OfType<CategoricalDataPoint>().ToList();
var visibleDateTimes = new List<DateTime>();
foreach (var categoricalDataPoint in categoricalDataPoints)
{
if (categoricalDataPoint.Category is DateTime dateTime)
{
visibleDateTimes.Add(dateTime);
}
}
我试图获取第一个轴并将其解析为 DateTimeContinuousAxis 并使用 ActualRange 但此范围正在考虑图表的所有 dateTimes,而不仅仅是可见的:
var categoricalDataPoints = crvMain.Series.Where(serie => serie.IsVisible).SelectMany(serie => serie.DataPoints)
.OfType<CategoricalDataPoint>().ToList();
var visibleDateTimes = new List<DateTime>();
if (crvMain.Axes[0] is DateTimeContinuousAxis dateTimeContinuousAxis)
{
foreach (var categoricalDataPoint in categoricalDataPoints)
{
if (categoricalDataPoint.Category is DateTime dateTime)
{
if (dateTime >= dateTimeContinuousAxis.ActualRange.Minimum && dateTime <= dateTimeContinuousAxis.ActualRange.Maximum)
{
visibleDateTimes.Add(dateTime);
}
}
}
}
加布里埃尔, 我准备了一个示例代码片段,演示如何在执行平移/缩放操作后获取可见数据点。下面的截图说明了取得的成果:
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
public RadForm1()
{
InitializeComponent();
LineSeries lineSeries = new LineSeries();
lineSeries.ShowLabels = true;
lineSeries.PointSize = new SizeF(8, 8);
for (int i = 0; i < 10; i++)
{
lineSeries.DataPoints.Add(new CategoricalDataPoint(6 + i * i, DateTime.Now.AddDays(i)));
}
DateTimeContinuousAxis continuousAxis = new DateTimeContinuousAxis();
continuousAxis.PlotMode = AxisPlotMode.BetweenTicks;
continuousAxis.LabelFormat = "{0:d}";
//First assign the axis to the VerticalAxis property and then add the series to the chart
lineSeries.HorizontalAxis = continuousAxis;
radChartView1.Series.Add(lineSeries);
this.radChartView1.ShowPanZoom = true;
this.radChartView1.View.ZoomChanged += View_ZoomChanged;
this.radChartView1.View.PanChanged += View_PanChanged;
}
private void View_ZoomChanged(object sender, EventArgs e)
{
GetVisiblePoints();
}
private void View_PanChanged(object sender, EventArgs e)
{
GetVisiblePoints();
}
public void GetVisiblePoints()
{
List<CategoricalDataPoint> visiblePoints = new List<CategoricalDataPoint>();
IChartView view = ((IChartView)this.radChartView1.View);
foreach (ChartSeries series in this.radChartView1.Series)
{
foreach (var dp in series.DataPoints)
{
CategoricalDataPoint cdp = (CategoricalDataPoint)dp;
if (CheckIfDataPointIsVisible(view, cdp))
{
visiblePoints.Add(cdp);
}
}
}
foreach (CategoricalDataPoint dp in visiblePoints)
{
Console.WriteLine(dp.Value +" >> "+dp.Category);
}
}
private bool CheckIfDataPointIsVisible(IChartView view, CategoricalDataPoint cdp)
{
double width = ((ChartSeries)cdp.Presenter).Axes[1].Model.LayoutSlot.Width;
RadRect viewport = new RadRect(-view.PlotOriginX + width, -view.PlotOriginY, view.ViewportWidth, view.ViewportHeight);
return viewport.IntersectsWith(cdp.LayoutSlot);
}
private void radButton1_Click(object sender, EventArgs e)
{
GetVisiblePoints();
}
}