写在前面:使用传统的TreeView,要增加个小功能,如三状态的TreeItem,经常都是需要很高的编程技术和大量的代码。而在.net新的界面设计中平台中,这个事情是很容易的,你要做的事就是发挥自己的想像力,组装手头上的小组件。
效果图
下图的图标功能,不是使用winform平台的ImageList和TreeView的组合做出来的,而是通过继承和自定义 TreeViewItem实体的效果,并且,代码量还真是少,关键点在于,TreeViewItem的Header的属性是object,也就是相当于别 的控件的Content,object表示,你可以任意放内容进去。
源代码
既然可以任意放内容进Header属性,那就放一个容器进去也没问题。正是出于这个想法,就放在一个StackPanel,它的内部 依次是TextBlock和Image,然后为Image指定设置的属性SelectedImage和UnselectedImage,这是 System.Windows.Media.ImageSource类型的对象。
最后,在项目中放一些图片来使用。如在根目录下,放一个Images文件夹,下面放多个图片。这个图片的生成操作都是嵌入的资源。
for (int i = 0; i < 10; i++)
{
ImagedTreeViewItem _pitem = new ImagedTreeViewItem();
_pitem.Text = "测试分支" + i;
_pitem.SelectedImage = new BitmapImage(
new Uri("pack://application:,,/Images/OPENFOLD.BMP"));
_pitem.UnselectedImage = new BitmapImage(
new Uri("pack://application:,,/Images/CLSDFOLD.BMP"));
treeView1.Items.Add(_pitem);
for (int j = 0; j < 5; j++)
{
ImagedTreeViewItem _item = new ImagedTreeViewItem();
_item.Text = "测试分支" + j;
_item.SelectedImage = new BitmapImage(
new Uri("pack://application:,,/Images/OPENFOLD.BMP"));
_item.UnselectedImage = new BitmapImage(
new Uri("pack://application:,,/Images/CLSDFOLD.BMP"));
_pitem.Items.Add(_item);
}
}