在用於WinForms的DevExpress XtraCharts中,有沒有辦法讓Y軸在用戶左右滾動數據時自動調整(以便當前顯示的數據屏幕填滿了大部分圖表)?在DevExpress XtraCharts中爲WinForms動態調整Y軸
如果不是自動有任何演示或有人會有任何指示如何做到這一點?
你可以看到這個視頻這種效應發生當用戶滾動左,右Y軸的變化:https://www.youtube.com/watch?v=HmA6vANrKKk
在用於WinForms的DevExpress XtraCharts中,有沒有辦法讓Y軸在用戶左右滾動數據時自動調整(以便當前顯示的數據屏幕填滿了大部分圖表)?在DevExpress XtraCharts中爲WinForms動態調整Y軸
如果不是自動有任何演示或有人會有任何指示如何做到這一點?
你可以看到這個視頻這種效應發生當用戶滾動左,右Y軸的變化:https://www.youtube.com/watch?v=HmA6vANrKKk
根據DevExpress的技術支持,你必須做你自己:
「這是必要的計算,並在Auto adjust Y-Axis range when scrolling on zooming on X-Axis thread軸Y範圍手動所描述的設置,請嘗試此解決方案,讓我知道,如果你需要。對此解決方案實施提供額外幫助。「
我還必須添加以下語句,以獲得Y軸的變化顯示:
stockView.AxisY.VisualRange.SideMarginsValue = 0
就在Axis.VisualRange.Auto屬性設置爲true
指定的最小和最大軸值自動計算基於正在繪製的系列。
我相信這會設置整個數據範圍的最小值和最大值......我希望這可以根據* visible *數據設置最小值和最大值......並在向左滾動時動態更改和正確的......這似乎是演示正在做的事情。 –
@BrianRice嗯...你是對的...我已經更新了我的答案 - VisualRange而不是WholeRange – DmitryG
@DmitryG,這看起來不正確。 VisualRange.Auto將可視範圍設置爲WholeRange的範圍,我不確定它是一個錯誤還是故意的。有沒有辦法將可視範圍設置爲可見序列點的最小值和最大值? –
也許這可以幫助一些。以下代碼解決了兩個問題:a)在縮放或scrooling時更新主ChartControl上的yAxis,以及b)在關聯的RangeControl上調整範圍時更新相同的代碼。
我使用RangeControl除了我ChartControl和奇怪的事件RangeControl的RangeChanged
甚至當你縮放或滾動的主圖上引發。這不應該是,即使相反也不是這樣:當更改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,其中數據點是結構保存一個DateTime時間戳和double類型的值的集合。但是綁定可以通過無數種方式完成。另外請注意,在這裏你甚至不需要連接滾動或縮放事件,因爲上述提到的奇怪之處在於當您滾動或縮放時會引發RangeControl的RangeChanged
事件。
我發現DevExpress WinForms圖表庫中的一些設計和一些缺乏核心功能讓人非常尷尬,因爲它們允許調整最詳細的小項目,同時還可以忽略一些非常重要的功能和/或仍然沒有固定/添加多年後,由用戶提出。也許我是唯一抱怨的人,但我覺得應該表達自己的看法。
恐怕這對我不起作用。您能詳細說明如何將y軸範圍設置爲當時圖表上可見點的最小值和最大值的函數嗎?謝謝 –
我不得不經過這個系列,計算落在當前AxisX.VisualRange值內的最小值和最大值,然後自己設置AxisY.VisualRange.MinValue和AxisY.VisualRange.MaxValue。 –
明白了,我很驚訝這不是內置的,但感謝指針。 –