WPF之TreeList的重写实现
2021-03-15 12:33
阅读:405
            
做项目的时候根据需求,WPF现有的控件不能完全满足我们的需求,
很多时候我们需要对现有的控件做一下加工。
最简单的我们可能会把Tree转换成List形式有的叫Grid形式就像下图一样

今天我先做一个完全用样式加工的例子,有时间我再把它做深加工写成一下通能形式
我们要先把treeView重写一下
?
| publicclassTreeListView : TreeView    {        //这两个默认的是TreeViewItem        protectedoverrideDependencyObject GetContainerForItemOverride()//创建或标识用于显示指定项的元素。         {            returnnewTreeListViewItem();        }        protectedoverrideboolIsItemItsOwnContainerOverride(objectitem)//确定指定项是否是(或可作为)其自己的 ItemContainer        {            //return item is TreeListViewItem;            bool_isTreeLVI = item isTreeListViewItem;            return_isTreeLVI;        }    }    publicclassTreeListViewItem : TreeViewItem    {        ///         /// hierarchy         ///         publicintLevel        {            get            {                if(_level == -1)                {                    TreeListViewItem parent =                        ItemsControl.ItemsControlFromItemContainer(this) asTreeListViewItem;//返回拥有指定的容器元素中 ItemsControl 。                     _level = (parent != null) ? parent.Level + 1 : 0;                }                return_level;            }        }        protectedoverrideDependencyObject GetContainerForItemOverride()        {            returnnewTreeListViewItem();        }        protectedoverrideboolIsItemItsOwnContainerOverride(objectitem)        {            //return item is TreeListViewItem;            bool_isITV = item isTreeListViewItem;            return_isITV;        }        privateint_level = -1;    } | 
上边是对TreeView的重写,因为TreeView是有层级关系的我们做的重写就把它的层级返回来
我们还要有一个列宽的转换
?
| ///     ///      ///      ///     publicclassLevelToIndentConverter : IValueConverter    {        publicobjectConvert(objecto, Type type, objectparameter, CultureInfo culture)        {            returnnewThickness((int)o * c_IndentSize, 0, 0, 0);        }        publicobjectConvertBack(objecto, Type type, objectparameter, CultureInfo culture)        {            thrownewNotSupportedException();        }        privateconstdoublec_IndentSize = 25.0;    } | 
下边是样式和使用方法
我们是把TreeView的样式加上了GridViewColumnCollection实现 的这个TreeView和ListView一样有标头和列
前台页面
?
|         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:l="clr-namespace:TreeViewListDemoT"        Title="MainWindow"Height="350"Width="525">                    TargetType="{x:Type ToggleButton}">                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              Data="M 0 2 L 0 3 L 2 3 L 2 5 L 3 5 L 3 3 L 5 3 L 5 2 L 3 2 L 3 0 L 2 0 L 2 2 Z"/>                                                                                                                                                                                                                                                                                                                             Converter={StaticResource LevelToIndentConverter},RelativeSource={RelativeSource AncestorType={x:Type l:TreeListViewItem}}}"                             IsChecked="{Binding Path=IsExpanded,RelativeSource={RelativeSource AncestorType={x:Type l:TreeListViewItem}}}"ClickMode="Press"/>                                                                                                                                                                            >                                                                                                                                  Background="{TemplateBinding Background}"                              BorderBrush="{TemplateBinding BorderBrush}"                              BorderThickness="{TemplateBinding BorderThickness}"                              Padding="{TemplateBinding Padding}">                                                                      Content="{TemplateBinding Header}"                                      Columns="{StaticResource gvcc}"/>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    >                                                                                                                                                                                                                                                                                                                                                                                                                                                                DataContext="{Binding}">                                                                                                                                                                     | 
后台代码
?
| usingSystem;usingSystem.Collections.Generic;usingSystem.Collections.ObjectModel;usingSystem.ComponentModel;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;namespaceTreeViewListDemoT{    ///     /// MainWindow.xaml 的交互逻辑    ///     publicpartialclassMainWindow : Window    {        publicMainWindow()        {            InitializeComponent();            ObjForTest root = newObjForTest();            ObjForTest depart = newObjForTest("Department", null, "");            ObjForTest c1 = newObjForTest( "li", 45, "M");            ObjForTest c2 = newObjForTest( "xu", 30, "W");            ObjForTest c3 = newObjForTest("zhang", 22, "M");            ObjForTest cc1 = newObjForTest( "shen", 30, "M");            ObjForTest cc2 = newObjForTest( "zhao", 18, "W");            ObjForTest cc3 = newObjForTest( "wang", 32, "M");            ObjForTest ccc1 = newObjForTest( "qian", 20, "W");            root.Children.Add(depart);            depart.Children.Add(c1);            depart.Children.Add(c2);            depart.Children.Add(c3);            c1.Children.Add(cc1);            c2.Children.Add(cc2);            c3.Children.Add(cc3);            cc1.Children.Add(ccc1);            this._list.ItemsSource = root.Children;        }    }    publicclassObjForTest     {        publicObjForTest() { }        publicObjForTest( stringname, int? age, stringsex)        {                        this._sex = sex;            this._age = age;            this._name = name;                    }        privatestring_name;        privateint? _age;        privatestring_sex;               publicstringSex         {             get{ returnthis._sex; }             set{ this._sex = value; }         }        publicint? Age         {             get{ returnthis._age; }            set{ this._age = value; }        }              publicstringName        {            get{ return_name; }            set            {                _name = value;            }        }        privateObservableCollectionnewObservableCollection        publicObservableCollection        {            get{ return_children; }        }         }} | 
最后给代码下载 TreeViewListDemoT.rar
评论
亲,登录后才可以留言!