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的多层时间轴,譬如下图表示两层时间轴:
显然,每一层时间轴有不同的缩放机制,而每一种放大机制都对应了一个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分钟。