Silverlight自定义控件系列 – TreeView (1)
1: public FancyTreeView()
2: {
3: this.DefaultStyleKey = typeof(FancyTreeView);
4: }
5:
this.DefaultStyleKey = typeof(FancyTreeView); 这一句的作用是让控件跟样式对应上,如果没有,那么无论你再怎么修改样式,效果都是一片空白。
TreeView的工作暂时到此结束,因为今天的重点不在于TreeView,而是它的子控件TreeViewItem。
新建一个Class,命名为FancyTreeViewItem,让它继承自HeaderedItemsControl,同样的实现构造函数:
1: /// <summary>
2: /// Initializes a new instance of the FancyTreeViewItem class
3: /// </summary>
4: public FancyTreeViewItem()
5: {
6: this.DefaultStyleKey = typeof(FancyTreeViewItem);
7: }
8:
这时候把控件拖到页面上,效果一片空白,当然,因为还没有设定样式。
控件在页面上:
1: <Grid x:Name="LayoutRoot" Background="White">
2: <my:FancyTreeView Height="235" HorizontalAlignment="Left" Margin="74,22,0,0" Name="fancyTreeView1" VerticalAlignment="Top" Width="165">
3: <my:FancyTreeViewItem Header="1"/>
4: </my:FancyTreeView>
5: </Grid>
6:
图1.1 没有样式的控件效果
现在给控件添加样式。添加文件夹,命名为Themes,新建Silverlight Resource Dictionary,命名为FancyTreeViewItemStyle。同时,为了让控件邦定样式,必须新建Generic.xaml(大小写无关),并把刚才的资源文件作为资源嵌入引用。把这两个文件放到Themes里面
图1.2 新建资源文件作为样式模板存放文件
Generic.xaml引用资源文件:
1: <ResourceDictionary
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
4: <ResourceDictionary.MergedDictionaries>
5: <ResourceDictionary Source="/MySilverlightControls;component/Themes/FancyTreeViewItemStyle.xaml"/>
6: </ResourceDictionary.MergedDictionaries>
7: </ResourceDictionary>
8:
注意,此文件必须以”/命名空间;component/文件路径”格式来写,路径为文件在工程中的位置。这样,只要编辑FancyTreeViewItemStyle.xaml文件就可以变更控件的外观。
接着先把TreeViewItem的Header显示出来(这里我用Blend 4来做样式)。在ControlTemplate上添加一个Grid名为Root,在Grid里面放一个ContentPresenter名为Header,用来显示TreeViewItem的Header,点击Content属性右边的小正方形,出来菜单后选择Template Binding->Header。把Style的Template属性设定为”FancyTreeViewItemDefaultTemplate”。
图1.3 模板结构图
图1.4 设置Header的Content属性
FancyTreeViewItemStyle.xaml:
1: <ResourceDictionary
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:FancyControls="clr-namespace:MySilverlightControls;assembly=MySilverlightControls"
5: >
6: <!-- FancyTreeViewItemDefaultTemplate -->
7: <ControlTemplate TargetType="FancyControls:FancyTreeViewItem" x:Key="FancyTreeViewItemDefaultTemplate">
8: <Grid x:Name="Root">
9: <ContentPresenter x:Name="Header" Content="{TemplateBinding Header}"/>
10: </Grid>
11:
12: </ControlTemplate>
13:
14: <!-- FancyTreeViewItem -->
15: <Style TargetType="FancyControls:FancyTreeViewItem">
16: <Setter Property="Template" Value="{StaticResource FancyTreeViewItemDefaultTemplate}"/>
17: </Style>
18: </ResourceDictionary>
19:
再来看下刚才的效果是否有变化:
图1.5 绑定样式模板后的TreeViewItem效果
Silverlight自定义控件系列 – TreeView (1)的更多相关文章
- Silverlight自定义控件系列 – TreeView (2) 基本布局和States
TreeView的树形结构都以缩进方式显示,现在来完成这部分. 首先,要定义出每个节点上都包含什么东西.先看看Win7资源管理器的TreeView: 图2.1 资源管理器 一个通用的TreeView至 ...
- Silverlight自定义控件系列 – TreeView (4) 缩进
接下来是缩进,没有缩进的Tree怎么看都不顺眼. 首先,定义节点深度Depth(注:回叫方法暂没有代码,以后要用到): 1: /// <summary> 2: /// Using a De ...
- Silverlight自定义控件系列 – TreeView (3) 添加展开和收起事件
由于Writer嫌我文章过长,只能把上篇拆开两半了.以下是接着上篇的. 准备工作做完了,现在就要完成点击事件. 定义Expander和单击事件: 1: /// <summary> 2: / ...
- 一步一步学Silverlight 2系列文章
概述 由TerryLee编写的<Silverlight 2完美征程>一书,已经上市,在该系列文章的基础上补充了大量的内容,敬请关注.官方网站:http://www.dotneteye.cn ...
- 一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(30):使用Transform实现更炫的效果(下)
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(29):使用Transform实现更炫的效果(上)
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(28):图片处理
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
随机推荐
- HttpClient配置SSL绕过https证书
https://blog.csdn.net/irokay/article/details/78801307 HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的 ...
- 远程获得的有趣的linux命令
使用这些工具从远程了解天气.阅读资料等. 我们即将结束为期 24 天的 Linux 命令行玩具日历.希望你有一直在看,如果没有,请回到开始,从头看过来.你会发现 Linux 终端有很多游戏.消遣和奇怪 ...
- where T : class含义
.NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型where T : class ...
- Elasticsearch 疑难解惑
Elasticsearch是如何实现Master选举的? Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单 ...
- Linux服务器上Tomcat的Web工程部署
Linux服务器上Tomcat的Web工程部署 部署Web应用到Tomcat服务器就是将开放好的JavaWeb应用打包成war包,然后发布到tomcat服务器的webapps目录下: 步骤1,先进入t ...
- 使用wireshark分析tcp/ip报文之报文头
以太网报文的结构如下: 其中,以太网的帧头: 14 Bytes:MAC目的地址48bit(6B),MAC源地址48bit(6B),Type域2B,一共14B. IP头部: TCP头部: http:// ...
- STL与泛型编程(第一周)
part 1 C++模版简介 一,模版概观 1.模板 (Templates)是C++的一种特性,允许函数或类(对象)通过泛型(generic types)的形式表现或运行. 模板可以使得函数或类在对应 ...
- 20145127《java程序设计》第三次实验
实验三 敏捷开发与XP实践 一.实验内容及其步骤 1.配置开源中国公钥 2.找到ssh公钥 3.在开源中国添加公钥 4.下载同组同学项目 5.推送代码到开源中国 6.推送代码成功 二.实验感想总结: ...
- 剑指Offer——跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路分析 这个问题可以先从简单开始考虑,台阶只有1阶,只有1种跳法,台阶有2阶,有2种跳法:一种两 ...
- strerror函数的总结
定义函数:char * strerror(int errnum); 函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回. 返回值:返 ...