TreeView的树形结构都以缩进方式显示,现在来完成这部分。

首先,要定义出每个节点上都包含什么东西。先看看Win7资源管理器的TreeView:

图2.1 资源管理器

一个通用的TreeView至少有缩进,箭头,Header。但是我们常常会用到勾选功能,也会用到图标来达到更高的友好度,因此这里暂时先按一下的格局来定义:

缩进 箭头 选择框 图标 显示文字
       子节点

那么开始了。用上次的模板,把Root分成两行,在Root的第一行中添加一个Border,用来放置节点的所有物件;在第二行中添加一个ItemsPresenter,名为ItemsHost,用来表示子节点集合。

接着在Border中再添加一个Grid用来布局,Grid分5列(原因看上表格),第一列添加一个Grid名为Indention,缩进用;第二列添加一个ToggleButton名为Expander作箭头按钮(非常好用);第三列放CheckBox;第四列放一个Image;把Header拖到第五列上。这样,简单的基础布局做好了。

图2.2.1 基础布局(1)

图2.2.2 基础布局(2)

图2.3 基础布局效果图

现在我们开始实现通过点击Expander来显示和隐藏子节点。首先增加展开和收起的模板状态:

 1: [TemplateVisualState(Name = "Expanded", GroupName = "ExpandedStates")]
 2: [TemplateVisualState(Name = "Collapsed", GroupName = "ExpandedStates")]
 3: public class FancyTreeViewItem : HeaderedItemsControl 
 4:  

编译之后,在Blend 4的States界面上会看到:

图2.4 States中的新状态

现在我们在Base下把ItemsHost的Visibility设为Collapsed,然后点选Expanded,当左边圆点变红后,把ItemsHost的Visibility设为Visible。

图2.5 录制不同的States

States已经录制好了,但是现在点击Expander还不能转到相应的State,所以要添加一个状态变量用来记录目前是被展开还是收起状态,当状态改变的时候转到相应的State。

记录状态的IsExpanded以及回叫方法OnIsExpandedPropertyChanged:

 1: /// <summary> 
 2: /// Using a DependencyProperty as the backing store for IsExpanded. This enables animation, styling, binding, etc... 
 3: /// </summary> 
 4: public static readonly DependencyProperty IsExpandedProperty =
 5:  DependencyProperty.Register("IsExpanded", typeof(bool), typeof(FancyTreeViewItem),
 6:  new PropertyMetadata(false, new PropertyChangedCallback(FancyTreeViewItem.OnIsExpandedPropertyChanged))
 7: );
 8:  
 1: /// <summary> 
 2: /// Call back when IsExpanded property has been changed 
 3: /// </summary> 
 4: /// <param name="o">The target object</param> 
 5: /// <param name="e">The property changed event arrguments</param> 
 6: private static void OnIsExpandedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
 7: {
 8:  
 9: }
 10:  
 1: #region Properties
 2:  
 3: /// <summary> 
 4: /// Gets or sets a value indicating whether the items have been expanded 
 5: /// </summary> 
 6: public bool IsExpanded
 7: {
 8:  get { return (bool)GetValue(IsExpandedProperty); }
 9:  set { SetValue(IsExpandedProperty, value); }
 10: }
 11:  
 12: #endregion 
 13:  

转向状态的方法和事件的触发:

 1: /// <summary> 
 2: /// To raise the event handler 
 3: /// </summary> 
 4: /// <param name="handler">The target event handler</param> 
 5: /// <param name="e">The routed event arrguments</param> 
 6: private void RaiseEvent(RoutedEventHandler handler, RoutedEventArgs e)
 7: {
 8:  if (handler != null)
 9: {
 10: handler(this, e);
 11: }
 12: }
 13:  
 14: /// <summary> 
 15: /// To update the control's visual state 
 16: /// </summary> 
 17: /// <param name="userTransitions">The flag that whether allow to update</param> 
 18: internal virtual void UpdateVisualState(bool userTransitions)
 19: {
 20:  if (this.IsExpanded)
 21: {
 22:  VisualStateManager.GoToState(this, "Expanded", userTransitions);
 23: }
 24:  else 
 25: {
 26:  VisualStateManager.GoToState(this, "Collapsed", userTransitions);
 27: }
 28: }
 29:  
分享 分享到新浪Qing

0

Silverlight自定义控件系列 – TreeView (2) 基本布局和States的更多相关文章

  1. Silverlight自定义控件系列 – TreeView (1)

      原文路径:http://blog.csdn.net/wlanye/article/details/7265457 很多人都对MS自带的控件不太满意(虽然MS走的是简约风格),都会试图去修改或创建让 ...

  2. Silverlight自定义控件系列 – TreeView (4) 缩进

    接下来是缩进,没有缩进的Tree怎么看都不顺眼. 首先,定义节点深度Depth(注:回叫方法暂没有代码,以后要用到): 1: /// <summary> 2: /// Using a De ...

  3. Silverlight自定义控件系列 – TreeView (3) 添加展开和收起事件

    由于Writer嫌我文章过长,只能把上篇拆开两半了.以下是接着上篇的. 准备工作做完了,现在就要完成点击事件. 定义Expander和单击事件: 1: /// <summary> 2: / ...

  4. 一步一步学Silverlight 2系列(3):界面布局

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  5. 一步一步学Silverlight 2系列文章

    概述 由TerryLee编写的<Silverlight 2完美征程>一书,已经上市,在该系列文章的基础上补充了大量的内容,敬请关注.官方网站:http://www.dotneteye.cn ...

  6. 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  7. 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  8. 一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  9. 一步一步学Silverlight 2系列(18):综合实例之RSS阅读器

    一步一步学Silverlight 2系列(18):综合实例之RSS阅读器   概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支 ...

随机推荐

  1. bind,live,delegate

    .live() 到目前为止,一切似乎很完美.可惜,事实并非如此.因为.live()方法并不完美,它有如下几个主要缺点: $()函数会找到当前页面中的所有td元素并创建jQuery对象,但在确认事件目标 ...

  2. zw版【转发·台湾nvp系列Delphi例程】HALCON MaxImage1

    zw版[转发·台湾nvp系列Delphi例程]HALCON MaxImage1 procedure TForm1.FormShow(Sender: TObject);begin Set8087CW($ ...

  3. AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 6. Mathematical Concepts and Methods

    uva 106 这题说的是 说计算 x^2 + y^2  =  z^2  xyz 互质 然后计算个数和 在 N内 不在 勾股数之内的数的个数 然后去找需要的 维基百科上 看到 另 n*m*2 =b   ...

  4. ac1066

    经过分析后的二分 题目是 Josnch星球是一个赌博之风盛行的星球.每个人一出生就有一定数额的钱,之后的所有收入只能由赌博获得(OMG,如果RP不好,输光了所有的 钱...)假设赌博公司的某场赌博有N ...

  5. 护眼:我的DIY电脑护眼妙招

    每天对着电脑,埋头敲代码,一段时间之后.总是觉得眼睛很涩很难受,所以找到一些对抗的视疲劳的方法.不用花费任何钱,可以让眼睛享受地看着我们的屏幕,方法很简单,过来看看(小伎俩,大牛勿笑~) 一.WIN7 ...

  6. Python: Pycharm简单介绍

    1. Pycharm是什么?                                                                                       ...

  7. Mocha describe 生命周期

    1 describe('test', function() { 2 // 在本测试块的所有测试用例之前执行且仅执行一次 3 before(function() { 4 5 }); 6 // 在本测试块 ...

  8. linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

  9. Chrome 性能监测

    前端性能优化一直是前端工作中必不可少的一部分,但是我们如何知道哪些部分的性能有优化的空间呢?此时,Chrome 性能监测就派上用场了. 正所谓:知己知彼,百战百胜,只有确定了性能瓶颈,才能有条不紊地进 ...

  10. Windows下MongoDB安装

    1.解压mongodb-win32-i386-1.8.1.zip ,创建路径d:\mongodb ,将解压后的Bin文件Copy to 此文件夹下 2.d:\mongodb 下建立Data文件夹 d: ...