在 Telerik ChartView 中放大后可以从图表中获取可见数据点吗?

问题描述 投票:0回答:1

我有一个带有一些数据的 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);
            }
        }
    }
}

c# winforms telerik .net-4.8
1个回答
0
投票

加布里埃尔, 我准备了一个示例代码片段,演示如何在执行平移/缩放操作后获取可见数据点。下面的截图说明了取得的成果:

    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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.