在DevExpress XtraCharts中为WinForms动态调整Y轴

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

在DevExpress XtraCharts for WinForms中,当用户在数据中左右滚动时,有没有办法让Y轴自动调整(这样当前显示在屏幕上的数据就会填满图表的大部分)?

如果不是自动有任何演示或有人有任何指示如何这样做?

您可以在此视频中看到此效果,因为用户向左和向右滚动Y轴更改:https://www.youtube.com/watch?v=HmA6vANrKKk

winforms charts devexpress
4个回答
1
投票

根据DevExpress技术支持,您必须自己完成:

“有必要按照Auto adjust Y-Axis range when scrolling on zooming on X-Axis thread中的说明手动计算和设置Axis Y范围。请尝试此解决方案,如果您需要有关此解决方案实施的额外帮助,请告诉我。”

我还必须添加以下语句才能显示Y轴更改:

stockView.AxisY.VisualRange.SideMarginsValue = 0 

0
投票

只需将Axis.VisualRange.Auto属性设置为true即可指定根据绘制的系列自动计算最小和最大轴值。


0
投票

也许这会有所帮助。以下代码解决了两个问题:a)在缩放或scrooling时更新主ChartControl上的yAxis,以及b)在关联的RangeControl上调整范围时更新yAxis。

除了我的ChartControl之外,我还使用RangeControl,奇怪的是,即使在主图表上缩放或滚动,也会引发RangeControl的事件RangeChanged。这不应该和stanger相反,即使相反也不成立:当改变RangeControl的范围时,不会引发ChartControl的任何事件。更复杂的是,RangeControl的RangeChanged在后台线程上运行。

    private void RangeControlOnRangeChanged(object sender, RangeControlRangeEventArgs range)
    {
        var measureUnit = ((XYDiagram)chartControl.Diagram).AxisX.DateTimeScaleOptions.MeasureUnit;
        var origin = default(DateTime);
        DateTime minDt, maxDt;

        switch (measureUnit)
        {
            case DateTimeMeasureUnit.Millisecond:
                minDt = origin.AddMilliseconds((double) range.Range.Minimum);
                maxDt = origin.AddMilliseconds((double) range.Range.Maximum);
                break;

            case DateTimeMeasureUnit.Second:
                minDt = origin.AddSeconds((double) range.Range.Minimum);
                maxDt = origin.AddSeconds((double) range.Range.Maximum);
                break;

            case DateTimeMeasureUnit.Minute:
                minDt = origin.AddMinutes((double) range.Range.Minimum);
                maxDt = origin.AddMinutes((double) range.Range.Maximum);
                break;

            case DateTimeMeasureUnit.Hour:
                minDt = origin.AddHours((double) range.Range.Minimum);
                maxDt = origin.AddHours((double) range.Range.Maximum);
                break;

            case DateTimeMeasureUnit.Day:
                minDt = origin.AddDays((double) range.Range.Minimum);
                maxDt = origin.AddDays((double) range.Range.Maximum);
                break;

            case DateTimeMeasureUnit.Year:
                minDt = origin.AddYears((int)(double) range.Range.Minimum);
                maxDt = origin.AddYears((int)(double) range.Range.Maximum);
                break;

            default:
                throw new NotImplementedException();
        }

        var visibleDataPoints = DataSeries.Where(x => x.TimeStamp >= minDt && x.TimeStamp <= maxDt);
        var newMinValue = visibleDataPoints.Min(x => x.Value);
        var newMaxValue = visibleDataPoints.Max(x => x.Value);

        chartControl.BeginInvoke(new Action(() => ((XYDiagram)chartControl.Diagram).AxisY.VisualRange.SetMinMaxValues(newMinValue, newMaxValue)));
    }

请注意,此处的DataSeries是一个实现IList的集合,其中DataPoint是包含DateTime时间戳和double类型值的struct。但绑定可以用无数种方式完成。另请注意,在这里您甚至不需要连接Scroll或Zoom事件,因为上面提到的奇怪之处在于滚动或缩放时会引发RangeControl的RangeChanged事件。

我发现DevExpress WinForms图表库的一些设计和一些缺乏核心功能非常令人尴尬,因为它们允许调整最详细的小项目,同时缺少一些非常重要的功能和/或仍未修复/添加年份他们被用户提出后。也许我是唯一一个抱怨但我觉得应该表达的人。


0
投票

试试以下代码:

diagram.DependentAxesYRange = DefaultBoolean.True;
diagram.AxisY.WholeRange.AlwaysShowZeroLevel = false;
© www.soinside.com 2019 - 2024. All rights reserved.