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

推荐订阅源

The Cloudflare Blog
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
罗磊的独立博客
博客园 - 聂微东
博客园_首页
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
量子位
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
月光博客
月光博客
T
The Exploit Database - CXSecurity.com
Google DeepMind News
Google DeepMind News
H
Help Net Security
O
OpenAI News
Blog — PlanetScale
Blog — PlanetScale
S
Security Affairs
S
Security @ Cisco Blogs
Microsoft Security Blog
Microsoft Security Blog
T
The Blog of Author Tim Ferriss
AI
AI
MongoDB | Blog
MongoDB | Blog
G
Google Developers Blog
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
Cloudbric
Cloudbric
H
Heimdal Security Blog
J
Java Code Geeks
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
I
Intezer
GbyAI
GbyAI

博客园 - 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: }