Silverlight TreeView 带 checkbox和图片

前段时间做Silverlight TreeView 控件,但是要带checkbox和图片,在网上到处找相关的例子,效果图如下

xaml代码

<UserControl x:Class="SlmenuTest.Tree"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:common="clr-namespace:System.Windows;assembly=System.Windows.Controls"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <UserControl.Resources>
        <common:HierarchicalDataTemplate x:Key="Level3Template">
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Icon}" Width="16" Height="16"/>
                <CheckBox />
                <TextBlock Text="{Binding Name}"  Foreground="Black" />
            </StackPanel>
        </common:HierarchicalDataTemplate>
        
        <common:HierarchicalDataTemplate x:Key="Level2Template" ItemsSource="{Binding Level3s}" ItemTemplate="{StaticResource Level3Template}">
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Icon}" Width="16" Height="16"/>
                <CheckBox />
                <TextBlock Text="{Binding Name}" Foreground="Green"/>
            </StackPanel>
        </common:HierarchicalDataTemplate>
        
        <common:HierarchicalDataTemplate x:Key="Level1Template" ItemsSource="{Binding Level2s}" ItemTemplate="{StaticResource Level2Template}">
            <StackPanel  Orientation="Horizontal">
                <Image Source="{Binding Icon}" />
                <CheckBox />
                <TextBlock Foreground="Blue" Text="{Binding Name}"/>
            </StackPanel>
        </common:HierarchicalDataTemplate>
    </UserControl.Resources>
View Code

后台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace SlmenuTest
{
    public partial class Tree : UserControl
    {

       

        public Tree()
        {
            InitializeComponent();
            InitTreeData();
        }



        #region Data
        private void InitTreeData()
        {
            myTree.ItemsSource = new ObservableCollection<Level1>
            {
                new Level1
                {
                    Name = "test1",
                    Icon="../images/default.png",
                    Level2s = 
                    { 
                        new Level2
                        {
                            Name="基础信息",
                            Icon = "../images/search.png",
                            Level3s = 
                            { 
                                new Level3 { Name = "类别" ,Icon = "../images/computer.png"}, 
                                new Level3 { Name = "部门" ,Icon = "../images/computer_on.png"},
                                new Level3 { Name = "类别2" ,Icon = "../images/exit.png"},
                                new Level3 { Name = "部门2" ,Icon = "../images/edit.png"}
                            }
                        },
                        new Level2
                        {
                            Name="扩展信息",
                            Icon="../images/search.png"
                        }

                    }
                },
                new Level1
                {
                    Name="test2",
                    Icon="../images/default.png",
                    Level2s=
                    {
                        new Level2
                        {
                            Name="报表管理", 
                            Icon = "../images/search.png",
                            Level3s = 
                            { 
                                new Level3 { Name = "报表1" ,Icon = "../images/default.png"},
                                new Level3 { Name = "报表2" ,Icon = "../images/default.png"},
                                new Level3 { Name = "报表3" ,Icon = "../images/default.png"},
                                new Level3 { Name = "报表4",Icon="../images/default.png"}
                            }
                        }
                    }
                },
                new Level1
                {
                    Name="test3",
                    Icon="../images/default.png",
                    Level2s=
                    {
                        new Level2
                        {
                            Name="系统管理",
                            Icon = "../images/search.png",
                            Level3s = 
                            { 
                                new Level3 { Name = "权限设置" ,Icon = "../images/default.png"},
                                new Level3 { Name = "用户管理" , Icon = "../images/default.png"}
                            }
                        }
                    }
                }

            };
        }
        #endregion

        private void myTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            TreeViewItem item = e.NewValue as TreeViewItem;
            
        }
       
    }


    public class Level1
    {
        public Level1()
        {
            Level2s = new ObservableCollection<Level2>();
        }
        public string Name { get; set; }
        public string Icon { get; set; }
        public ObservableCollection<Level2> Level2s { get; set; }
    }

    public class Level2
    {
        public Level2()
        {
            Level3s = new ObservableCollection<Level3>();
        }

        public string Name { get; set; }
        public string Icon { get; set; }
        public ObservableCollection<Level3> Level3s { get; set; }
    }

    public class Level3
    {
        public string Name { get; set; }
        public string Icon { get; set; }
        //public event EventHandler click;
    }
}
View Code

第二种效果图如下

xaml代码如下

<UserControl x:Class="SLColorPickerDemo.Tree"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <UserControl.Resources>
        <Style x:Key="RedItemStyle" TargetType="sdk:TreeViewItem">
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="images/default.png"/>
                            <CheckBox />
                            <TextBlock Text="{Binding}" Foreground="Red" FontStyle="Italic" />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="IsExpanded" Value="False" />
        </Style>
    </UserControl.Resources>



    <Grid x:Name="LayoutRoot" Background="White">
        <sdk:TreeView Margin="5" Grid.Column="0" Grid.Row="1" Name="tvTree" SelectedItemChanged="tvTree_SelectedItemChanged" />
        <Border BorderBrush="Gray" BorderThickness="1" Padding="8" Margin="5">
            <StackPanel x:Name="DetailsPanel" Margin="4" Width="155">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="版块ID: " FontWeight="Bold"  />
                    <TextBlock Text="{Binding ForumID}" />
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="版块名称: " FontWeight="Bold"  />
                    <TextBlock Text="{Binding ForumName}" />
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="版块信息: " FontWeight="Bold" />
                    <TextBlock x:Name="DetailText" TextWrapping="Wrap" Text="{Binding ForumName}"/>
                </StackPanel>
            </StackPanel>
        </Border>
    </Grid>
</UserControl>
View Code

后台代码

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace SLColorPickerDemo
{
    public class ForumInfo : INotifyPropertyChanged
    {
        public int ForumID { get; set; }
        public int ParendID { get; set; }
        public string ForumName { get; set; }

        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;

        private void PropertyChaged(string propertyName)
        {
            PropertyChangedEventHandler handle = PropertyChanged;
            if (handle != null)
                handle.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }
}
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace SLColorPickerDemo
{
    public partial class Tree : UserControl
    {

        List<ForumInfo> forumList = new List<ForumInfo>();

        public Tree()
        {
            InitializeComponent();
            forumList = GetForumData();
            AddTreeNode(0, null);
        }


        private void AddTreeNode(int parentID, TreeViewItem treeViewItem)
        {
            List<ForumInfo> result = (from forumInfo in forumList
                                      where forumInfo.ParendID == parentID
                                      select forumInfo).ToList<ForumInfo>();

            if (result.Count > 0)
            {
                foreach (ForumInfo foruminfo in result)
                {
                    TreeViewItem objTreeNode = new TreeViewItem();
                    objTreeNode.Header = foruminfo.ForumName;
                    objTreeNode.DataContext = foruminfo;


                    objTreeNode.ItemContainerStyle = this.Resources["RedItemStyle"] as Style;
                    //添加根节点
                    if (treeViewItem == null)
                    {
                        tvTree.Items.Add(objTreeNode);
                        //tvTree.ItemContainerStyle = this.Resources["TreeStyle"] as Style;
                    }
                    else
                    {
                        treeViewItem.Items.Add(objTreeNode);
                    }
                    AddTreeNode(foruminfo.ForumID, objTreeNode);
                }
            }
        }


        public List<ForumInfo> GetForumData()
        {
            List<ForumInfo> forumList = new List<ForumInfo>();
            forumList.Add(new ForumInfo() { ForumID = 1, ParendID = 0, ForumName = "笔记本版块" });
            forumList.Add(new ForumInfo() { ForumID = 2, ParendID = 0, ForumName = "台式机版块" });

            forumList.Add(new ForumInfo() { ForumID = 3, ParendID = 1, ForumName = "Dell笔记本" });
            forumList.Add(new ForumInfo() { ForumID = 4, ParendID = 1, ForumName = "IBM笔记本" });
            forumList.Add(new ForumInfo() { ForumID = 5, ParendID = 4, ForumName = "IBM-T系列" });
            forumList.Add(new ForumInfo() { ForumID = 6, ParendID = 4, ForumName = "IBM-R系列" });

            forumList.Add(new ForumInfo() { ForumID = 7, ParendID = 2, ForumName = "联想台式机" });
            forumList.Add(new ForumInfo() { ForumID = 8, ParendID = 2, ForumName = "方正台式机" });
            forumList.Add(new ForumInfo() { ForumID = 9, ParendID = 2, ForumName = "HP台式机" });
            forumList.Add(new ForumInfo() { ForumID = 10, ParendID = 7, ForumName = "联想家悦H系列" });
            forumList.Add(new ForumInfo() { ForumID = 11, ParendID = 7, ForumName = "联想IdeaCentre系列" });

            return forumList;
        }

        private void tvTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            TreeViewItem item = e.NewValue as TreeViewItem;
            ForumInfo fi = item.DataContext as ForumInfo;

            DetailsPanel.DataContext = fi;
        }
    }
}
View Code

 

时间比较长了参考的文章找不到,找到了再把链接贴上。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。