Avalonia的如何定义TreeView和TreeviewItem的样式


前言

经过前面几篇文章已经了解到Selector的基础用法 本篇文章介绍一个TreeView的案例来详细带入Avalonia的Style的内部世界 TreeView的代码示例:

一、TreeView介绍

示例:TreeView绑定的对象为Items。主要改写的样式有TreeView.DataTemplates的TreeViewItem的ControlTemplate

二、改写样式

1.TreeView.DataTemplates

TreeView.DataTemplates可以接受TreeDataTemplate并且绑定Item绑定的属性

代码如下(示例):

<TreeView.DataTemplates>
			<TreeDataTemplate ItemsSource="{Binding Children}">
				<Border Background="Transparent">
					<StackPanel Orientation="Horizontal">
						<Image  Source="{Binding Icon,Converter={StaticResource EnumIconConverter}}"   IsVisible="{Binding $parent[TreeViewItem].Level, Mode=OneWay,Converter={StaticResource LevelVisibleConverter}}"  Width="14" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5 0 0 0"></Image>
						<TextBlock  Width="234" x:Name="content"  PointerPressed="Children_PointerPressed" TextTrimming="CharacterEllipsis" Text="{Binding Name}" FontWeight="{Binding $parent[TreeViewItem].Level, Mode=OneWay, Converter={StaticResource LevelFontConverter}ConverterParameter=FontWeight}" FontSize="{Binding $parent[TreeViewItem].Level, Mode=OneWay, Converter={StaticResource LevelFontConverter}ConverterParameter=FontSize}" Foreground="{Binding $parent[TreeViewItem].Foreground}" Margin="5 0 0 0" VerticalAlignment="Center">
							<ToolTip.Tip>
								<StackPanel>
									<TextBlock Text="{Binding ElementName=content,Path=Text}"></TextBlock>
                                </StackPanel>
                            </ToolTip.Tip>
							</TextBlock>
					</StackPanel>
				</Border>
			</TreeDataTemplate>
		</TreeView.DataTemplates>

2.TreeViewItem的ControlTemplate

我们如果需要改写非数据绑定的基础样式,这时候会用到TreeViewItem的ControlTemplate 效果如下(示例): ![效果图](https://img-blog.csdnimg.cn/2021052014445916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvdWt1YW5nYmFvNzg1MA==,size_16,color_FFFFFF,t_70#pic_center)

代码如下(示例):

	<Setter Property="Template">
					<ControlTemplate>
						<StackPanel>
							<Border Name="SelectionBorder2"
									Focusable="True"
									Background="{TemplateBinding Background}"
									BorderBrush="{TemplateBinding BorderBrush}"
									BorderThickness="{TemplateBinding BorderThickness}"
									TemplatedControl.IsTemplateFocusTarget="True" Padding="0 3"
                                    >
								
                                <StackPanel Name="PART_Header"
                                            Margin="{TemplateBinding Level, Mode=OneWay, Converter={StaticResource LeftMarginConverter}}" Orientation="Horizontal" Spacing="5">
									<ToggleButton
												  Focusable="False"
												  IsChecked="{TemplateBinding IsExpanded, Mode=TwoWay}"
												   IsVisible="{Binding Children,Converter={StaticResource EnumerableVisiableConverter}}">
										<ToggleButton.Template>
											<ControlTemplate>
												<StackPanel Orientation="Horizontal" Name="HeaderPresenter">
													<Image Source="/Assets/icon/Default.png"  Classes="HeadImage" IsVisible="{Binding $parent[TreeViewItem].IsExpanded}"  Width="15"  Margin="5 0 0 0"></Image>
													<Image Source="/Assets/icon/Expaned.png"  IsVisible="{Binding !$parent[TreeViewItem].IsExpanded}" Grid.Column="1" Width="14"  Margin="5 0 0 0"></Image>
												</StackPanel>
											</ControlTemplate>
										</ToggleButton.Template>
									</ToggleButton>
									<ContentPresenter Name="PART_HeaderPresenter"
													  Focusable="False"
													  Content="{TemplateBinding Header}"
													  HorizontalContentAlignment="{TemplateBinding HorizontalAlignment}"
													  Padding="{TemplateBinding Padding}"
										/>
								</StackPanel>
							</Border>
							<ItemsPresenter Name="PART_ItemsPresenter"
											IsVisible="{TemplateBinding IsExpanded}"
											Items="{TemplateBinding Items}"
											ItemsPanel="{TemplateBinding ItemsPanel}"/>
						</StackPanel>
					</ControlTemplate>
				</Setter>

3.TreeView添加节点

直接在数据绑定里面添加即可

下面展示一些 内联代码片

 SignTreeModel signTreeModel = new SignTreeModel();
            _mSignTreeModel.Children.Add(signTreeModel);
            Random random=new Random();
            if (random.Next(0,2)==1)
            {
                signTreeModel.Children.Add(new SignTreeModel(){Name = random .NextDouble().ToString(),Icon=SignIcon.Error});
            }

示例代码: 示例Demo.

总结

以上就是TreeView的使用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值