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

推荐订阅源

博客园 - 三生石上(FineUI控件)
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
I
InfoQ
Latest news
Latest news
H
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Exploit Database - CXSecurity.com
雷峰网
雷峰网
Know Your Adversary
Know Your Adversary
人人都是产品经理
人人都是产品经理
C
Cisco Blogs
NISL@THU
NISL@THU
P
Proofpoint News Feed
Y
Y Combinator Blog
I
Intezer
博客园_首页
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
C
CERT Recently Published Vulnerability Notes
G
Google Developers Blog
P
Privacy & Cybersecurity Law Blog
MyScale Blog
MyScale Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
有赞技术团队
有赞技术团队
S
Schneier on Security
N
Netflix TechBlog - Medium
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Blog of Author Tim Ferriss
K
Kaspersky official blog
博客园 - 聂微东
S
Securelist
Recent Announcements
Recent Announcements
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
宝玉的分享
宝玉的分享
The GitHub Blog
The GitHub Blog
博客园 - 司徒正美
Vercel News
Vercel News
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
U
Unit 42
T
Tailwind CSS Blog
云风的 BLOG
云风的 BLOG
B
Blog
aimingoo的专栏
aimingoo的专栏
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - aimin

SharePoint Foundation中文档与文件、单据类型定制办法 SharePoint2010的牛刀:一、新的服务应用程序架构 Silverlight甘特图:五、Gantt图控件[已开源发布Codeplex] Silverlight甘特图:三、甘特图面板开发原理 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甘特图:四、树形DataGrid开发原理
aimin · 2012-01-29 · via 博客园 - aimin

1. 语法

1.1. XAML

2. 备注

当前版本的TreeGrid仅可以使用甘特图控件指定数据源格式。如需支持其他类型数据源,需要重新实现AbstractExpander和AbstractTreeGridLayout。

2.1. 定义Expander样式

通过自定义AbstractExpander的集成类,并设置TreeGrid.ExpanderProvider,可实现Expander的自定义,从而更换逻辑或样式。

自定义类的实现可参考默认提供的Expander类:SimpleTaskExpander

TreeGrid是扩展Silverlight自身提供的DataGrid实现的,关键是自定义了新的Column类型,此Column在每一行的单元格中添加了一个按钮控件,根据任务的层级缩进,并在用户单击时,发起一个“展开/折叠”事件,事件EventArgs中包含行所对应的任务Item数据。

代码如下:

   1: namespace V2TEK.Silverlight.Charts.TreeGridHelper
   2: {
   3:     /// <summary>
   4:     /// 包含一个默认的Expander,继承自AbstractExpander。
   5:     /// 如有必要,可以通过继承AbstractExpander,复写Expander,并设置ExpanderProvider。
   6:     /// </summary>
   7:     public class TreeGridExpanderColumn : DataGridTextColumn
   8:     {
   9:         public TreeGridExpanderColumn()
  10:         {
  11:         }
  12:  
  13:         private AbstractExpander CreateExpander()
  14:         {
  15:             return Activator.CreateInstance(ExpanderProvider) as AbstractExpander;        
  16:         }
  17:  
  18:         public Type ExpanderProvider
  19:         {
  20:             get;
  21:             set;
  22:         }
  23:  
  24:         protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
  25:         {
  26:             StackPanel panel = GeneratePanel(dataItem);
  27:             panel.Children.Add(base.GenerateEditingElement(cell, dataItem));
  28:             return panel;
  29:         }
  30:  
  31:         protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
  32:         {
  33:             StackPanel panel = GeneratePanel(dataItem);
  34:             panel.Children.Add(base.GenerateElement(cell, dataItem));
  35:             return panel;
  36:         }
  37:  
  38:         protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
  39:         {
  40:             TextBox ee = editingElement as TextBox;
  41:             if (ee == null)
  42:             {
  43:                 return string.Empty;
  44:             }
  45:             string text = ee.Text;
  46:             int length = text.Length;
  47:             KeyEventArgs args = editingEventArgs as KeyEventArgs;
  48:             if ((args != null) && (args.Key == Key.F2))
  49:             {
  50:                 ee.Select(length, length);
  51:                 return text;
  52:             }
  53:             ee.Select(0, length);
  54:  
  55:             return base.PrepareCellForEdit(editingElement, editingEventArgs);
  56:         }
  57:  
  58:         public AbstractExpander GetExpander(DataGridRow row)
  59:         {
  60:             StackPanel panel = (StackPanel)this.GetCellContent(row);
  61:             AbstractExpander expander = panel.Children[0] as AbstractExpander;
  62:             expander.Data = row.DataContext;
  63:             return expander;
  64:         }
  65:  
  66:         private StackPanel GeneratePanel(object dataItem)
  67:         {
  68:             StackPanel panel = new StackPanel();
  69:             panel.Orientation = Orientation.Horizontal;
  70:             panel.Children.Add(GenerateExpander(dataItem));
  71:             return panel;
  72:         }
  73:  
  74:         private AbstractExpander GenerateExpander(object dataItem)
  75:         {
  76:             AbstractExpander expander = CreateExpander();
  77:             expander.Data = dataItem;
  78:             expander.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(expander_PropertyChanged);
  79:             return expander;
  80:         }
  81:  
  82:         void expander_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
  83:         {
  84:             if (e.PropertyName == AbstractExpander.DATA_PROPERTY)
  85:                 (sender as AbstractExpander).Update();
  86:         }
  87:     }
  88: }