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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Avalonia是一个跨平台的用户界面框架,可以用于构建现代化的、具有吸引力的客户端应用程序。它给开发者提供了一套丰富的工具和API,使得开发定制化的UI变得更加简单和高效。 Avalonia的文档是一个完整指南,可以帮助开发者了解和学习如何使用Avalonia框架来构建应用程序。文档分为几个部分,包括入门指南、概念和架构、框架特性、控件库和示例。通过这些文档,开发者可以掌握Avalonia的基本概念和工作原理,了解如何使用不同的工具和API来开发具有吸引力的界面。 入门指南部分提供了安装和配置Avalonia框架的详细说明,包括使用命令行和包管理器安装、创建新项目和设置开发环境等。概念和架构部分解释了Avalonia的核心概念,例如界面元素、布局和事件系统,并介绍了Avalonia的整体架构和组件。 框架特性部分介绍了Avalonia提供的各种功能和特性,例如样式和主题、绑定和命令系统、动画和动态布局等。控件库部分详细介绍了Avalonia内置的各种控件类型和自定义控件的开发方法。示例部分提供了一些完整的示例代码,帮助开发者更好地理解和应用Avalonia框架的各种功能。 总之,Avalonia的文档是一个非常有价值的资源,可以帮助开发者快速入门和提高使用Avalonia框架的能力。无论是初学者还是有经验的开发者,都可以从这些文档中获得有关Avalonia框架的宝贵知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值