由于Writer嫌我文章过长,只能把上篇拆开两半了。以下是接着上篇的。

准备工作做完了,现在就要完成点击事件。

定义Expander和单击事件:

 1: /// <summary> 
 2: /// The togglebutton for expanding or collapsing the items when mouse left button clicked on it 
 3: /// </summary> 
 4: private ToggleButton expander;
 5:  
 1: /// <summary> 
 2: /// Gets or sets the toggle button Expander 
 3: /// </summary> 
 4: public ToggleButton Expander
 5: {
 6:  get 
 7: {
 8:  return this.expander;
 9: }
 10:  
 11:  set 
 12: {
 13:  if (this.expander != null)
 14: {
 15:  this.expander.Click -= new RoutedEventHandler(this.OnExpanderClick);
 16: }
 17:  
 18:  this.expander = value;
 19:  
 20:  if (this.expander != null)
 21: {
 22:  this.expander.IsChecked = new bool?(this.IsExpanded);
 23:  this.expander.Click += new RoutedEventHandler(this.OnExpanderClick);
 24: }
 25: }
 26: }
 27:  
 1: /// <summary> 
 2: /// Method occurs when mouse left button click on Expander 
 3: /// </summary> 
 4: /// <param name="sender">The source object</param> 
 5: /// <param name="e">The routed event arrguments</param> 
 6: private void OnExpanderClick(object sender, RoutedEventArgs e)
 7: {
 8:  bool flag = !this.IsExpanded;
 9:  this.IsExpanded = flag;
 10: }
 11:  
 1: /// <summary> 
 2: /// Method occurs when the expanded state has been changed 
 3: /// </summary> 
 4: /// <param name="handler">The target event handler</param> 
 5: /// <param name="args">The routed arrguments</param> 
 6: private void ChangeExpandedState(RoutedEventHandler handler, RoutedEventArgs args)
 7: {
 8:  ToggleButton button = this.Expander;
 9:  
 10:  if (button != null)
 11: {
 12: button.IsChecked = new bool?(this.IsExpanded);
 13: }
 14:  
 15:  this.UpdateVisualState(true);
 16:  this.RaiseEvent(handler, args);
 17: }
 18:  

接下来就是最后一步了,就是定义展开和收起事件,并把它们和刚才的准备工作结合起来

定义event handler:

 1: #region Events
 2:  
 3: /// <summary> 
 4: /// The expanded event 
 5: /// </summary> 
 6: public event RoutedEventHandler Expanded;
 7:  
 8: /// <summary> 
 9: /// The Collapsed event 
 10: /// </summary> 
 11: public event RoutedEventHandler Collapsed;
 12:  
 13: #endregion 
 14:  

定义事件:

 1: /// <summary> 
 2: /// To expand the children 
 3: /// </summary> 
 4: /// <param name="e">The routed event arrguments</param> 
 5: public void OnExpanded(RoutedEventArgs e)
 6: {
 7:  this.ChangeExpandedState(this.Expanded, e);
 8: }
 9:  
 10: /// <summary> 
 11: /// To collapse the children 
 12: /// </summary> 
 13: /// <param name="e">The routed event arrguments</param> 
 14: public void OnCollapsed(RoutedEventArgs e)
 15: {
 16:  this.ChangeExpandedState(this.Collapsed, e);
 17: }
 18:  

修改OnIsExpandedPropertyChanged方法:

 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:  FancyTreeViewItem item = o as FancyTreeViewItem;
 9:  bool newValue = (bool)e.NewValue;
 10:  RoutedEventArgs args = new RoutedEventArgs();
 11:  
 12:  if (newValue)
 13: {
 14: item.OnExpanded(args);
 15: }
 16:  else 
 17: {
 18: item.OnCollapsed(args);
 19: }
 20: }
 21:  

从模板中寻找Expander模块跟类中Expander按钮对应起来:

 1: /// <summary> 
 2: /// Override the function for banding template 
 3: /// </summary> 
 4: public override void OnApplyTemplate()
 5: {
 6:  this.Expander = this.GetTemplateChild("Expander") as ToggleButton;
 7:  base.OnApplyTemplate();
 8: }
 9:  

最后运行看下效果:

图3.1 节点收起的效果图

图3.2 节点展开的效果图

Silverlight自定义控件系列 – TreeView (3) 添加展开和收起事件的更多相关文章

  1. Silverlight自定义控件系列 – TreeView (2) 基本布局和States

    TreeView的树形结构都以缩进方式显示,现在来完成这部分. 首先,要定义出每个节点上都包含什么东西.先看看Win7资源管理器的TreeView: 图2.1 资源管理器 一个通用的TreeView至 ...

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

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

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

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

  4. 一步一步学Silverlight 2系列(25):综合实例之Live Search

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

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

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

  6. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

    概述 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系列(17):数据与通信之ADO.NET Data Services

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

随机推荐

  1. VisualStudio: 窗口背景颜色设置成黑色

    Tools>Options>Environment>General >Color theme

  2. python 文件操作 练习:取得文件的最后存取时间

    #coding=utf-8 import osimport time file_atime=int(os.path.getatime('d:\\a.txt'))print "file_ati ...

  3. nginx 总结

    本文转自:http://freeloda.blog.51cto.com/2033581/1288553 ,感谢大神的辛勤付出! 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之 ...

  4. new Runnable中的 this

    package com.test; public class BB extends AA{ public String bb = "bbbbb"; public void gg() ...

  5. Docker容器和数据可视化管理工具Flocker

    Flocker 可轻松实现 Docker 容器及其数据的管理.这是一个数据卷管理器和多主机的 Docker 集群管理工具,你可以通过它来控制数据.可用来在 Docker 中运行你的数据库.查询和 K/ ...

  6. python之路----socketserver模块

    socketserver import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): ...

  7. 企业应用开发中最常用c++库

    log4cpp,http://log4cpp.sourceforge.net/,跟log4j一样,不说最重要,绝对是最常用的. zk 客户端,https://blog.csdn.net/yangzhe ...

  8. c++的各种类型转换方式

    const_cast 用于去掉const属性,把const类型的指针变为非const类型的指针,如:const int *fun(int x,int y){} int *ptr=const_cast& ...

  9. 20145332 MAL_简单后门

    20145332 MAL_简单后门 用NC获取远程主机的shell 2.1.1 Windows获得Linux的权限 首先要在Windows主机下安装ncat.exe,安装完成后需要配置环境变量path ...

  10. HDU 1358 Period(KMP+最小循环节)题解

    思路: 这里只要注意一点,就是失配值和前后缀匹配值的区别,不懂的可以看看这里,这题因为对子串也要判定,所以用前后缀匹配值,其他的按照最小循环节做 代码: #include<iostream> ...