在WinForms的DevXpress XtraCharts中动态调整Y轴

在WinForms的DevXpress XtraCharts中动态调整Y轴,winforms,charts,devexpress,Winforms,Charts,Devexpress,在针对WinForms的DevXPress XtraCharts中,是否有一种方法可以让用户在数据中左右滚动时自动调整Y轴(以便当前显示在屏幕上的数据填充大部分图表) 如果不是自动的,是否有任何演示或有人会有任何关于如何做这方面的指导 当用户向左和向右滚动Y轴时,您可以在该视频上看到这种效果:只需将属性设置为true,即可指定根据所绘制的序列自动计算最小和最大轴值。根据DevExpress技术支持,您必须自己进行: “需要按照中的说明手动计算和设置Y轴范围。请尝试此解决方案,如果您需要此解决方案

在针对WinForms的DevXPress XtraCharts中,是否有一种方法可以让用户在数据中左右滚动时自动调整Y轴(以便当前显示在屏幕上的数据填充大部分图表)

如果不是自动的,是否有任何演示或有人会有任何关于如何做这方面的指导


当用户向左和向右滚动Y轴时,您可以在该视频上看到这种效果:

只需将属性设置为
true
,即可指定根据所绘制的序列自动计算最小和最大轴值。

根据DevExpress技术支持,您必须自己进行:

“需要按照中的说明手动计算和设置Y轴范围。请尝试此解决方案,如果您需要此解决方案实施方面的其他帮助,请告诉我。”

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

stockView.AxisY.VisualRange.SideMarginsValue = 0 

也许这有点帮助。下面的代码解决了两个问题:a)在缩放或滚动时更新主图表控件上的yAxis,以及b)在调整关联range控件上的范围时更新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)));
    }
private void RangeControlOnRangeChanged(对象发送方,RangeControlRangeEventArgs范围)
{
var measureUnit=((XYDiagram)chartControl.Diagram).AxisX.DateTimeScaleOptions.measureUnit;
var origin=默认值(日期时间);
DateTime minDt,maxDt;
开关(测量单位)
{
案例日期时间测量单位毫秒:
minDt=origin.add毫秒((双)range.range.Minimum);
maxDt=origin.add毫秒((双)range.range.max);
打破
案例日期时间测量单位秒:
minDt=原点.AddSeconds((双)范围.范围.最小值);
maxDt=原点.AddSeconds((双)范围.range.max);
打破
案例日期时间测量单位分钟:
minDt=origin.AddMinutes((双)range.range.Minimum);
maxDt=origin.AddMinutes((双)range.range.max);
打破
案例日期时间测量单位小时:
minDt=原点.AddHours((双)范围.范围.最小值);
maxDt=origin.AddHours((双)range.range.max);
打破
案例日期时间测量单位日期:
minDt=origin.AddDays((双)range.range.Minimum);
maxDt=origin.AddDays((双)range.range.max);
打破
案例日期时间测量单位年份:
minDt=起点。添加年份((整数)(双)范围。范围。最小值);
maxDt=origin.AddYears((int)(double)range.range.max);
打破
违约:
抛出新的NotImplementedException();
}
var visibleDataPoints=DataSeries.Where(x=>x.TimeStamp>=minDt&&x.TimeStamp x.Value);
var newMaxValue=visibleDataPoints.Max(x=>x.Value);
chartControl.BeginInvoke(新操作(()=>((XYDiagram)chartControl.Diagram).AxisY.VisualRange.SetMinMaxValues(newMinValue,newMaxValue));
}
注意,这里的DataSeries是一个实现IList的集合,其中DataPoint是一个struct,它包含一个DateTime时间戳和一个double类型的值。但是绑定可以通过多种方式完成。还请注意,这里您甚至不需要连接滚动或缩放事件,因为上述奇怪之处在于,当您滚动或缩放时,RangeControl的
RangeChanged
事件被触发

我发现DevXpress WinForms图表库的一些设计和一些缺乏核心功能的地方非常令人尴尬,因为它们允许调整最详细的小项目,而一些非常重要的功能在用户提出后几年内缺失和/或仍然没有修复/添加。也许我是唯一一个抱怨的人,但我觉得应该表达出来

请尝试以下代码:

diagram.DependentAxesYRange = DefaultBoolean.True;
diagram.AxisY.WholeRange.AlwaysShowZeroLevel = false;

我相信这会设置整个数据范围的最小值和最大值。。。我想根据可见数据设置最小值和最大值。。。当你左右滚动时,动态地进行更改。。。这似乎就是演示所做的。@BrianRice嗯……你说得对。。。我已经更新了我的答案-VisualRange而不是WholeRange@DmitryG,这似乎不对。VisualRange。自动将可视范围设置为WholeRange的范围,我不确定这是错误还是故意的。有没有办法将可视范围设置为可见系列点的最小值和最大值?@Matt,我必须自己检查系列,计算最小值和最大值,然后设置AxisY.VisualRange.MinValue和AxisY.VisualRange.MaxValue。@BrianRice,谢谢,我很惊讶这不是内置的。谢谢,恐怕这对我不起作用。请详细说明如何将y轴范围设置为当时图表上可见点的最小值和最大值的函数?ThanksI必须遍历该系列并计算当前AxisX.VisualRange值范围内的最小值和最大值,然后自己设置Axis.VisualRange.MinValue和Axis.VisualRange.MaxValue。明白了,我很惊讶这不是内置的,但感谢指针。