关于WPF TreeView我的一点心得

首先我的样式操作:
文件名是:TreeViewStyle

 <Style x:Key="DefaultTreeViewItem" TargetType="{x:Type TreeViewItem}">
        <Setter Property="MinHeight" Value="40" />
        <Setter Property="Foreground" Value="#333233" />
        <!--<Setter Property="Background" Value="#484C7F" />-->
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="Margin" Value="5,0,5,0" />
        <Setter Property="FontSize" Value="14" />
        <!--<EventSetter Event="PreviewMouseLeftButtonDown" Handler="TreeViewItem_Click" />-->
        <!--<Setter Property="local:ControlAttachProperty.FIconSize" Value="19"/>-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Border x:Name="Bd" Margin="3" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="4"
                                BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"
                                MinHeight="{TemplateBinding MinHeight}" UseLayoutRounding="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                            <!--多层级间隔,暂缓-->
                            <!--<Grid Margin="{Binding Converter={StaticResource LengthConverter}, RelativeSource={x:Static RelativeSource.TemplatedParent}}"-->
                            <Grid Margin="{TemplateBinding Margin}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="15" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition MinWidth="18" Width="Auto" />
                                    <ColumnDefinition Width="15" />
                                </Grid.ColumnDefinitions>
                                <!--展开收缩按钮-->
                                <ToggleButton x:Name="ExpanderBtn" Grid.Column="2" HorizontalContentAlignment="Stretch"
                                              IsChecked="{Binding Path=IsExpanded, RelativeSource={x:Static RelativeSource.TemplatedParent}, Mode=TwoWay}"
                                              ClickMode="Press" >
                                    <ToggleButton.Template>
                                        <ControlTemplate TargetType="ToggleButton">
                                            <Border>
                                                <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                            </Border>
                                        </ControlTemplate>
                                    </ToggleButton.Template>
                                    <ToggleButton.Content>
                                        <TextBlock x:Name="ExpanderIcon" Foreground="#333233" FontFamily="../../Fonts/MyFonts/#iconfont" Grid.Column="1" Text="&#xf104;" FontSize="18" />
                                        <!--FontSize="{TemplateBinding local:ControlAttachProperty.FIconSize}" />-->
                                    </ToggleButton.Content>
                                </ToggleButton>
                                <!--内容-->
                                <ContentPresenter x:Name="PART_Header" Grid.Column="1" ContentSource="Header"
                                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                  HorizontalAlignment="Left"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </Grid>
                        </Border>
                        <!--<ItemsPresenter Grid.Row="1" Margin="18,0,0,0" x:Name="ItemsHost"  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />-->

                        <Border x:Name="MianBan" Grid.Row="1" CornerRadius="4" Margin="5,0,5,0">
                            <ItemsPresenter  x:Name="ItemsHost"/>
                        </Border>
                        <!--Margin="18,0,0,0"-->
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsExpanded" Value="False">
                            <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed" />
                        </Trigger>
                        <Trigger Property="IsExpanded" Value="True">
                            <!--<Setter TargetName="ExpanderIcon" Property="Text" Value="&#xe62d;" />-->
                            <Setter TargetName="ExpanderIcon" Property="Text" Value="&#xf107;" />
                        </Trigger>
                        <Trigger Property="HasItems" Value="False">
                            <Setter TargetName="ExpanderIcon" Property="Visibility" Value="Hidden" />
                        </Trigger>
                        <!--<Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" TargetName="Bd" Value="#60636C" />
                            <Setter Property="Foreground" TargetName="ExpanderIcon" Value="#FFFFCC" />
                            <Setter Property="Foreground" Value="#FFFFCC" />
                        </Trigger>-->
                        <!--<DataTrigger Binding="{Binding IsGrouping}" Value="1">
                            <Setter Property="Background" TargetName="MianBan" Value="#E6E7EF" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding IsGrouping}" Value="2">
                            <Setter Property="Background" TargetName="MianBan" Value="#CFD0D7" />
                        </DataTrigger>-->
                        <!--<Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" TargetName="Bd" Value="#60636C" />
                            <Setter Property="Foreground" TargetName="ExpanderIcon" Value="#F9DEC1" />
                            <Setter Property="Foreground" Value="#F9DEC1" />
                        </Trigger>-->

                        <!--<MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsSelected" Value="True" />
                                        <Condition Property="Selector.IsSelectionActive" Value="True" />
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Background" TargetName="Bd" Value="#60636C" />
                                    <Setter Property="Foreground" TargetName="ExpanderIcon" Value="red" />
                                    <Setter Property="Foreground" Value="#F9DEC1" />
                                </MultiTrigger>-->
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="True" />
                                <!--<Condition Property="Selector.IsSelectionActive" Value="True" />-->
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="#60636C" />
                            <Setter Property="Foreground" TargetName="ExpanderIcon" Value="#F9DEC1" />
                            <Setter Property="Foreground" Value="#F9DEC1" />
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <Style x:Key="TypeTreeStyle" TargetType="TreeView">
        <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
        <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"></Setter>
        <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
        <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="False" />
        <Setter Property="Background"  Value="Transparent"/>
        <Setter Property="Padding" Value="0"/>
        <!--<EventSetter Event="PreviewMouseLeftButtonDown" Handler="TreeViewItem_PreviewMouseLeftButtonDown" />-->
        <Setter Property="ItemContainerStyle" Value="{StaticResource DefaultTreeViewItem}"></Setter>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsItemsHost="True" IsVirtualizing="True" VirtualizationMode="Recycling" Margin="0"/>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeView">
                    <ScrollViewer Padding="4" Focusable="False" CanContentScroll="False">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="TypeNode" TargetType="TreeViewItem">
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>   <!--如果有这个属性可以通过这属性获取到是否选择的状态-->
        <Setter Property="FontWeight" Value="Normal"/>
        <Setter Property="IsExpanded" Value="True"/> <!--设置直接展开-->
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="Background" Value="Brown"/>
            </Trigger> 
        </Style.Triggers>
    </Style>
    <HierarchicalDataTemplate x:Key="TypeTreeGroup" ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal">
            <!--<Image Source="/WpfTutorialSamples;component/Images/user.png" Margin="0,0,5,0" />-->
            <!--当然这里可以用Image数据来操作 也可以用binding来绑定对应的图片标示-->
            <TextBlock Text="{Binding ThisName}" FontSize="13"/>
        </StackPanel>
    </HierarchicalDataTemplate>

我的界面配置:

<Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Styles/TreeViewStyle.xaml"></ResourceDictionary>
                <ResourceDictionary Source="/Styles/ButtonSetStyle.xaml"></ResourceDictionary>
                <!--<ResourceDictionary Source="../../Assets/style/ScrollBarThumbStyle.xaml"></ResourceDictionary>-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

然后 关于 treeview 的配置是

<TreeView Name="MainTree"  ItemsSource="{Binding TypeTree}" Style="{StaticResource TypeTreeStyle}" ItemContainerStyle="{StaticResource TypeNode}" ItemTemplate="{StaticResource TypeTreeGroup}" SelectedItemChanged="MainTree_SelectedItemChanged"> 
 </TreeView>

这个配置必须要 绑定ThisName textbolck 的text 显示 然后
ItemsSource="{Binding Children} 对应就是属性children数据
其中 属性为:

   /// <summary>
    /// 栏目表
    /// </summary>
    public  class MainItemInfos
    {
              
        /// <summary>
        /// 
        /// </summary> 
        [Description("")]
        public int  Id { get; set; } 
        /// <summary>
        /// 编号
        /// </summary> 
        [Description("编号")]
        public string ThisNo { get; set; } 
        /// <summary>
        /// 父id
        /// </summary> 
        [Description("父id")]
        public int  PId { get; set; } 
        /// <summary>
        /// 当前地址
        /// </summary> 
        [Description("当前地址")]
        public string  ThitPath { get; set; } 
        /// <summary>
        /// 当前名称
        /// </summary> 
        [Description("当前名称")]
        public string  ThisName { get; set; } 
        /// <summary>
        /// 是否启用
        /// </summary> 
        [Description("是否启用")]
        public bool  IsUsed { get; set; } 
        /// <summary>
        /// 数据类型(0,首页,1 栏目,3根栏目)
        /// </summary> 
        [Description("数据类型(0 顶级页,1首页,2 栏目,3根栏目)")]
        public EItemType  PathType { get; set; } 
        /// <summary>
        /// 
        /// </summary> 
        [Description("")]
        public DateTime  CreateDate { get; set; } 
        /// <summary>
        /// 
        /// </summary> 
        [Description("")]
        public DateTime  Updated { get; set; }
        /// <summary>
        /// 当前
        /// </summary>
        public MainItemInfos ParentInfo { get; set; }

        /// <summary>
        /// 当前所有子数据
        /// </summary>
        public ObservableCollection<MainItemInfos> Children { get; set; }
    }

另外 从数据库获取来后的list操作

 /// <summary>
        /// 获取树结构下所有数据
        /// </summary>
        /// <param name="ThisInfo"></param>
        /// <param name="ThisListAll"></param>
        /// <param name="RetureInfolist"></param>
        public void GetTreeNodeModel(MainItemInfos ThisInfo, List<MainItemInfos> ThisListAll, ref List<MainItemInfos> RetureInfolist)
        {
            List<MainItemInfos> ListOut = new List<MainItemInfos>();
            IEnumerable<MainItemInfos> ListThisMains = ThisListAll.Where(x => x.PId == ThisInfo.Id);
            if (ListThisMains != null && ListThisMains.Count() > 0)
            {
                ThisInfo.Children = new System.Collections.ObjectModel.ObservableCollection<MainItemInfos>(ListThisMains);
                RetureInfolist.Add(ThisInfo);
                foreach (MainItemInfos OneInfo in ThisInfo.Children)
                { 
                    OneInfo.ParentInfo = ThisInfo;
                    GetChildren(OneInfo, ThisListAll);
                    //GetTreeNodeModel(OneInfo, ThisListAll, ref RetureInfolist);
                }
            }
        }
        /// <summary>
        /// 子目录下的文件(这样只有一个List可以只有一个树结构)一一更新
        /// </summary>
        /// <param name="ThisModel"></param>
        /// <param name="ListAll"></param>
        public void GetChildren(MainItemInfos ThisModel,List<MainItemInfos> ListAll)
        {
            if (ListAll != null )
            {
                IEnumerable<MainItemInfos> ListThisMains = ListAll.Where(x => x.PId == ThisModel.Id); 
                if (ListThisMains!=null &&  ListThisMains.Count() > 0)
                {
                    ThisModel.Children = new System.Collections.ObjectModel.ObservableCollection<MainItemInfos>(ListThisMains) ;
                    foreach (MainItemInfos OneItem in ThisModel.Children)
                    {
                        GetChildren(OneItem,ListAll);
                    }
                }
                
            }
          
        }
        /// <summary>
        /// 刷新树结构
        /// </summary>
        public void ReflashNodes()
        {
            List<MainItemInfos> ListDB = new DAL.DALMainItemInfos().QueryList().ToList();
            MainItemInfos ThisZongInfos = ListDB.Where(x => x.PathType == 0).FirstOrDefault();
            ListDB.Remove(ThisZongInfos);
            List<MainItemInfos> ListBinding = new List<MainItemInfos>();
            GetTreeNodeModel(ThisZongInfos, ListDB, ref ListBinding);
            if (ListBinding != null)
            {
                MainTree.ItemsSource = ListBinding;
            }
        }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF TreeView是一种在WPFWindows Presentation Foundation)应用程序中使用的控件,用于以分层结构显示数据。它类似于树形结构,其中每个节点可以有零个或多个子节点。 TreeView由一系列TreeNode组成,每个TreeNode代表一个节点。每个TreeNode可以包含一个或多个子节点,并且可以通过展开和折叠来显示或隐藏这些子节点。每个节点可以具有自定义的显示内容,通常是文本,也可以是任何WPF元素。 使用WPF TreeView,您可以创建具有层次结构的导航菜单、文件资源管理器、组织架构图等应用程序。您可以自定义节点的外观和行为,以及处理节点的选择和展开事件。 要使用WPF TreeView,您需要在XAML中声明TreeView和TreeNode。然后,您可以通过添加和删除TreeNode来动态构建树状结构,并使用数据绑定来显示和编辑树上的数据。 以下是一个简单的示例,演示如何在XAML中创建一个简单的TreeView: ```xaml <TreeView> <TreeViewItem Header="Root"> <TreeViewItem Header="Child 1" /> <TreeViewItem Header="Child 2" /> <TreeViewItem Header="Child 3"> <TreeViewItem Header="Grandchild 1" /> <TreeViewItem Header="Grandchild 2" /> </TreeViewItem> </TreeViewItem> </TreeView> ``` 这将创建一个具有三个一级节点的简单树状结构。您可以通过展开和折叠节点来显示或隐藏子节点。 希望这可以帮助您了解WPF TreeView的基本概念和用法。如果您有更具体的问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值