如何在Telerik RadChartView缩放后获取可见数据点?
获取Telerik RadChartView缩放后的可见数据点
问题背景
使用Telerik RadChartView控件展示数据,X轴为DateTimeContinuousAxis,Y轴为LinearAxis,通过LassoZoomController实现缩放功能。缩放后需要筛选出图表中仅可见的数据点,但原尝试使用DateTimeContinuousAxis.ActualRange属性时,该范围对应数据源的全量时间区间,而非当前视图的可见范围,无法实现筛选需求。
原尝试代码(无法正确筛选):
var categoricalDataPoints = radChartView.Series.Where(serie => serie.IsVisible).SelectMany(serie => serie.DataPoints) .OfType<CategoricalDataPoint>().ToList(); var visibleDateTimes = new List<DateTime>(); if (radChartView.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); } } } }
解决方案
Telerik RadChartView中,DateTimeContinuousAxis的VisibleRange属性才会实时反映当前视图的可见时间区间,缩放后该属性会自动更新。使用该属性替代ActualRange即可正确筛选可见数据点:
修改后的代码
var visibleDateTimes = new List<DateTime>(); // 获取X轴的可见时间范围 if (radChartView.Axes[0] is DateTimeContinuousAxis dateTimeAxis) { DateTime visibleMin = (DateTime)dateTimeAxis.VisibleRange.Minimum; DateTime visibleMax = (DateTime)dateTimeAxis.VisibleRange.Maximum; // 筛选可见区域内的数据点 visibleDateTimes = radChartView.Series .Where(serie => serie.IsVisible) .SelectMany(serie => serie.DataPoints.OfType<CategoricalDataPoint>()) .Where(point => point.Category is DateTime dateTime && dateTime >= visibleMin && dateTime <= visibleMax) .Select(point => (DateTime)point.Category) .ToList(); }
补充说明
如果需要在缩放操作完成后立即获取可见数据点,建议在RadChartView的ZoomChanged事件中执行筛选逻辑,确保VisibleRange已完成更新:
radChartView.ZoomChanged += (sender, e) => { var visibleDateTimes = new List<DateTime>(); if (radChartView.Axes[0] is DateTimeContinuousAxis dateTimeAxis) { DateTime visibleMin = (DateTime)dateTimeAxis.VisibleRange.Minimum; DateTime visibleMax = (DateTime)dateTimeAxis.VisibleRange.Maximum; visibleDateTimes = radChartView.Series .Where(serie => serie.IsVisible) .SelectMany(serie => serie.DataPoints.OfType<CategoricalDataPoint>()) .Where(point => point.Category is DateTime dateTime && dateTime >= visibleMin && dateTime <= visibleMax) .Select(point => (DateTime)point.Category) .ToList(); // 后续处理可见日期列表 } };
内容的提问来源于stack exchange,提问作者Gabriel Medeiros
相关产品推荐
相关产品推荐

