在DevExpress XtraCharts for WinForms中,当用户在数据中左右滚动时,有没有办法让Y轴自动调整(这样当前显示在屏幕上的数据就会填满图表的大部分)? / p>
如果没有自动进行任何演示,或者某人有任何指示如何做到这一点?
当用户向左和向右滚动Y轴更改时,您可以在此视频中看到此效果:https://www.youtube.com/watch?v=HmA6vANrKKk
答案 0 :(得分:1)
根据DevExpress技术支持,你必须自己做:
"有必要按照Auto adjust Y-Axis range when scrolling on zooming on X-Axis thread中的说明手动计算和设置Axis Y范围。请尝试此解决方案,如果您需要此解决方案实施的其他帮助,请告知我们。"
我还必须添加以下语句才能显示Y轴更改:
stockView.AxisY.VisualRange.SideMarginsValue = 0
答案 1 :(得分:0)
只需将Axis.VisualRange.Auto属性设置为true
,即可指定根据绘制的系列自动计算最小和最大轴值。
答案 2 :(得分: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图表库的一些设计和一些缺乏核心功能非常令人尴尬,因为它们允许调整最详细的小项目,同时缺少一些非常重要的功能和/或仍然没有修复/在用户提出之后的几年内增加了。也许我是唯一一个抱怨但我觉得应该表达的人。
答案 3 :(得分:0)
请尝试以下代码:
diagram.DependentAxesYRange = DefaultBoolean.True;
diagram.AxisY.WholeRange.AlwaysShowZeroLevel = false;