2014-03-28 75 views

回答

1

根據DevExpress的技術支持,你必須做你自己:

「這是必要的計算,並在Auto adjust Y-Axis range when scrolling on zooming on X-Axis thread軸Y範圍手動所描述的設置,請嘗試此解決方案,讓我知道,如果你需要。對此解決方案實施提供額外幫助。「

我還必須添加以下語句,以獲得Y軸的變化顯示:

stockView.AxisY.VisualRange.SideMarginsValue = 0 
+0

恐怕這對我不起作用。您能詳細說明如何將y軸範圍設置爲當時圖表上可見點的最小值和最大值的函數嗎?謝謝 –

+0

我不得不經過這個系列,計算落在當前AxisX.VisualRange值內的最小值和最大值,然後自己設置AxisY.VisualRange.MinValue和AxisY.VisualRange.MaxValue。 –

+0

明白了,我很驚訝這不是內置的,但感謝指針。 –

0

就在Axis.VisualRange.Auto屬性設置爲true指定的最小和最大軸值自動計算基於正在繪製的系列。

+0

我相信這會設置整個數據範圍的最小值和最大值......我希望這可以根據* visible *數據設置最小值和最大值......並在向左滾動時動態更改和正確的......這似乎是演示正在做的事情。 –

+0

@BrianRice嗯...你是對的...我已經更新了我的答案 - VisualRange而不是WholeRange – DmitryG

+0

@DmitryG,這看起來不正確。 VisualRange.Auto將可視範圍設置爲WholeRange的範圍,我不確定它是一個錯誤還是故意的。有沒有辦法將可視範圍設置爲可見序列點的最小值和最大值? –

0

也許這可以幫助一些。以下代碼解決了兩個問題: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圖表庫中的一些設計和一些缺乏核心功能讓人非常尷尬,因爲它們允許調整最詳細的小項目,同時還可以忽略一些非常重要的功能和/或仍然沒有固定/添加多年後,由用戶提出。也許我是唯一抱怨的人,但我覺得應該表達自己的看法。