惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
I
InfoQ
博客园 - Franky
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
T
Threatpost
Cloudbric
Cloudbric
D
Docker
M
MIT News - Artificial intelligence
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Vercel News
Vercel News
Martin Fowler
Martin Fowler
J
Java Code Geeks
AWS News Blog
AWS News Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
V
V2EX
博客园 - 【当耐特】
I
Intezer
爱范儿
爱范儿
F
Fortinet All Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy International News Feed
IT之家
IT之家
L
LINUX DO - 最新话题
B
Blog RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - aimin

SharePoint Foundation中文档与文件、单据类型定制办法 SharePoint2010的牛刀:一、新的服务应用程序架构 Silverlight甘特图:五、Gantt图控件[已开源发布Codeplex] Silverlight甘特图:四、树形DataGrid开发原理 Silverlight甘特图:三、甘特图面板开发原理 Silverlight甘特图:一、甘特图介绍及开发者之系统准备 SharePoint Silverlight Workspacer 1.0 Silverlight Gantt Chart 改进计划 为业务建模——MOSS的优势与劣势 招SharePoint人才必须看ASP.NET底子 杂谈项目中的那些事儿:计划与变化 杂谈项目中的那些事儿:人的力量 杂谈项目中的那些事儿:理想与现状 【转】7 Signs Your SharePoint Project Is in Trouble 【转】7 Keys to Microsoft SharePoint Success silverlight Gantt Chart Demo 谈谈代码设计 Show一下Silverlight写的GanttChart SharePoint特性一览
Silverlight甘特图:二、时间线开发原理
aimin · 2012-01-20 · via 博客园 - aimin

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分钟。