1.项目下载地址:https://gitee.com/confusedkitten/avalonia-demo
样式预览:

axaml代码 :
<UserControl xmlns="https://github.com/avaloniaui"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:model="clr-namespace:AvaloniaDemo.Models"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="AvaloniaDemo.Pages.Popup"><Grid VerticalAlignment="Top"><TextBox Grid.Column="1" Watermark="点一下" x:Name="singleHeader" Width="200" Height="40" BorderThickness="0 0 0 1"/><Popup Grid.Column="1" x:Name="singlePopup" MinHeight="200" IsOpen="False" PlacementTarget="singleHeader" Placement="BottomEdgeAlignedLeft" ><TreeView x:Name="TreeV" Width="350" x:DataType="model:TreeModel" SelectionChanged="singleTree_SelectedItemChanged" Background="{DynamicResource ComboBoxBackground}"><TreeView.ItemTemplate><TreeDataTemplate ItemsSource="{Binding Nodes}" x:DataType="model:TreeModel"><TextBlock Text="{Binding Name}"></TextBlock></TreeDataTemplate></TreeView.ItemTemplate></TreeView></Popup></Grid>
</UserControl>
后台代码:
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using AvaloniaDemo.Models;
using System.Collections.Generic;
using System.Collections.ObjectModel;namespace AvaloniaDemo.Pages;public partial class Popup : UserControl
{public ObservableCollection<TreeModel> trees { get; set; } = new ObservableCollection<TreeModel>{new TreeModel(){Name = "1",Nodes = new ObservableCollection<TreeModel>{new TreeModel() { Name="1.1",},new TreeModel() { Name="1.2",}}},new TreeModel(){Name = "2",Nodes = new ObservableCollection<TreeModel>{new TreeModel() { Name="2.1",},new TreeModel() { Name="2.2" },}}};public Popup(){InitializeComponent();singleHeader.AddHandler(Button.GotFocusEvent, singleHeaderClick);TreeV.ItemsSource = trees;DataContext = this;}/// <summary>/// 点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void singleHeaderClick(object? sender, RoutedEventArgs e){singlePopup.IsOpen = true;singlePopup.Open();}/// <summary>/// 树节点选中改变事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void singleTree_SelectedItemChanged(object sender, SelectionChangedEventArgs e){var trv = sender as TreeView;var trvItem = trv.SelectedItem as TreeModel;if (trvItem == null) return;singleHeader.Text = trvItem.Name.ToString();singlePopup.IsOpen = false;singlePopup.Close();}
}