Silverlight甘特圖:二、時間線開發原理


1. 語法

1.1. XAML

2. 備注

2.1. 布局計算

TimeLine作為時間軸(橫向坐標),其精度為毫秒。原點為StartDate,相對於原點的位置為某一時間點減去開始時間所得時間的毫秒數,即XPosition。

TimeLine布局計算繼承自ILayout接口,主要依賴於XPosition,ViewPortWidth,ViewPortHeight屬性。

出於性能考慮,TimeLine僅僅計算出當前ViewPortWidth和ViewPortHeight范圍內的所需的單元格(表示時間段的方格)。

2.2. 渲染

TimeLine允許自定義Renderer的風格,自定義的Renderer類必須繼承自ITimeLineEntryRenderer接口。可參考SimpleTimeLineEntryRenderer的實現。並指定TimeLine.ItemRendererProvider的值為自定義的Renderer類。

2.3. 放大/縮小

時間軸控件允許自定義放大縮小的層級,從而變換“年/季度”,“年/月”,“月/日”等不同樣式。

設定放大縮小層級,必須了解Dictionary<IDateTimeDescriptor, int>和最小MinDateTimeRangeWidth 的定義。

1) Dictionary<IDateTimeDescriptor, int>

IDateTimeDescriptor表示TimeLine上同一時間軸上每個方塊顯示的時間范圍,即一個單元時間范圍,如下面的代碼表示2季度:

   1:  
   2: new SimpleDateTimeDescriptor(2, DateTimeType.Quarter)

Dictionary包含N個IDateTimeDescriptor,依次排列。即排列中枚舉了N級單元時間范圍。

2) MinDateTimeRangeWidth

MinDateTimeRangeWidth 表示繪制IDateTimeDescriptor時間范圍的最小長度。如MinDateTimeRangeWidth = 80d; 則表示80像素表示2個季度時間的長度。

3) 放大原理

舉一個簡單的例子,設定如下:

   1:  
   2: ITaskDescriptor t = new SimpleTaskDescriptor{StartDate=2010/1/1, 
   3: EndDate=2010/4/1}
   4: MinDateTimeRangeWidth = 80d
   5: new SimpleDateTimeDescriptor(1, DateTimeType.Quarter)
   6: new SimpleDateTimeDescriptor(1, DateTimeType.Year)

上面定義時間開始與2010年1月1日,跨度為1個季度的任務,並定義了兩級單元時間范圍,此外,還定義單元時間范圍在屏幕上繪制的長度下限為80像素。

當甘特圖此任務條以>=80像素顯示時,TimeLine上單元格顯示為”X季度”。當任務以<80像素顯示時,時間軸上單元格顯示為”XX年”。

此外,還需注意Dictionary<IDateTimeDescriptor, int>類型中標紅的int類型,此類型參數表示”跳針”,用於TimeLine的多層時間軸,譬如下圖表示兩層時間軸:

timeline1

顯然,每一層時間軸有不同的縮放機制,而每一種放大機制都對應了一個Dictionary<IDateTimeDescriptor, int>類型的實例。從而形成”年/季度”,“年/月”等結構。

通過下面的例子,說明如何”跳針”, DefaultDateTimeRangeDescriptor是下層時間軸的縮放機制,DefaultDateTimeRangeDescriptor2是上層時間軸的縮放機制,上層時間軸使用了跳針:

   1: public static Dictionary<IDateTimeDescriptor, int> DefaultDateTimeRangeDescriptor
   2:         {
   3:             get
   4:             {
   5:                 if (_defaultDateTimeRangeDescriptor == null)
   6:                 {
   7:                     _defaultDateTimeRangeDescriptor = new Dictionary<IDateTimeDescriptor, int>();
   8:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(1, DateTimeType.Minute), 0);
   9:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(5, DateTimeType.Minute), 0);
  10:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(10, DateTimeType.Minute), 0);
  11:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(15, DateTimeType.Minute), 0);
  12:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(30, DateTimeType.Minute), 0);
  13:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(1, DateTimeType.Hour), 0);
  14:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(2, DateTimeType.Hour), 0);
  15:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(6, DateTimeType.Hour), 0);
  16:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(12, DateTimeType.Hour), 0);
  17:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(1, DateTimeType.WeekDay), 0);
  18:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(2, DateTimeType.Day), 0);
  19:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(4, DateTimeType.Day), 0);
  20:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(7, DateTimeType.Day), 0);
  21:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(1, DateTimeType.Month), 0);
  22:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(1, DateTimeType.Quarter), 0);
  23:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(2, DateTimeType.Quarter), 0);
  24:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(1, DateTimeType.Year), 0);
  25:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(2, DateTimeType.Year), 0);
  26:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(5, DateTimeType.Year), 0);
  27:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(10, DateTimeType.Year), 0);
  28:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(20, DateTimeType.Year), 0);
  29:                     _defaultDateTimeRangeDescriptor.Add(new SimpleDateTimeDescriptor(50, DateTimeType.Year), 0);
  30:                 }
  31:                 return _defaultDateTimeRangeDescriptor;
  32:             }
  33:         }
  34:  
  35:         public static Dictionary<IDateTimeDescriptor, int> DefaultDateTimeRangeDescriptor2
  36:         {
  37:             get
  38:             {
  39:                 if (_defaultDateTimeRangeDescriptor2 == null)
  40:                 {
  41:                     _defaultDateTimeRangeDescriptor2 = new Dictionary<IDateTimeDescriptor, int>();
  42:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Minute), 1); //-------0
  43:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(5, DateTimeType.Minute), 1);//-------1
  44:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(10, DateTimeType.Minute), 3);//-------2
  45:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(15, DateTimeType.Minute), 2);//-------3
  46:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(30, DateTimeType.Minute), 1);//-------4
  47:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Hour), 2);//-------5
  48:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(2, DateTimeType.Hour), 1);//-------6
  49:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(6, DateTimeType.Hour), 2);//-------7
  50:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(12, DateTimeType.Hour), 1);//-------8
  51:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Day), 3);//-------9
  52:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(2, DateTimeType.Day), 3);//-------10
  53:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(4, DateTimeType.Day), 2);//-------11
  54:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Week), 1);//-------12
  55:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Month), 1);//-------14
  56:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Quarter), 2);//-------15
  57:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(2, DateTimeType.Quarter), 1);//-------16
  58:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(1, DateTimeType.Year), 1);//-------18
  59:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(2, DateTimeType.Year), 1);//-------19
  60:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(5, DateTimeType.Year), 1);//-------20
  61:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(10, DateTimeType.Year), 1);//-------21
  62:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(20, DateTimeType.Year), 1);//-------22
  63:                     _defaultDateTimeRangeDescriptor2.Add(new SimpleDateTimeDescriptor2(50, DateTimeType.Year), 0);//-------22
  64:                 }
  65:                 return _defaultDateTimeRangeDescriptor2;
  66:             }
  67:         }

DeafultDateTimeDescriptor2中第一行Int = 1,意思是,如果當前時間軸上放大至:80像素/1分鍾的話,那么直接跳到下一個,用400像素的單元格表示5分鍾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM