当前位置: 首页 > news >正文

C# Avalonia 17- ControlTemplates - ControlTemplateBrowser

ControlTemplateBrowser.axaml代码

<Window 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"Height="544" Width="713" Loaded="Window_Loaded"x:Class="AvaloniaUI.ControlTemplateBrowser"Title="ControlTemplateBrowser"><Grid Margin="10" x:Name="grid" ColumnDefinitions="2*,5*"><ListBox x:Name="lstTypes" Background="WhiteSmoke"SelectionChanged="lstTypes_SelectionChanged"></ListBox><Grid Grid.Column="1" RowDefinitions="*,Auto" Margin="5"><ScrollViewer><TextBox x:Name="txtTemplate"TextWrapping="Wrap"AcceptsReturn="True"IsReadOnly="True"FontFamily="Consolas"FontSize="13" /></ScrollViewer><!-- 控件预览区 --><Border Grid.Row="1"BorderBrush="#DDD"BorderThickness="1"CornerRadius="6"Margin="0,10,0,0"Padding="10"Background="{DynamicResource ThemeBackgroundBrush}"><ContentPresenter x:Name="previewHost"HorizontalAlignment="Center"VerticalAlignment="Center" /></Border></Grid></Grid>
</Window>

ControlTemplateBrowser.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Chrome;
using Avalonia.Controls.Primitives;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Styling;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;namespace AvaloniaUI;public partial class ControlTemplateBrowser : Window
{public ControlTemplateBrowser(){InitializeComponent();}private readonly Dictionary<string, Type> typeMap = new(StringComparer.Ordinal);private void Window_Loaded(object? sender, RoutedEventArgs e){try{var asmNames = new[]{"Avalonia.Controls","Avalonia.Controls.Primitives","Avalonia.Controls.Shapes","Avalonia.Controls.DataGrid","Avalonia.Controls.ItemsRepeater","Avalonia.Controls.Documents"};var controlType = typeof(Control);var topLevel = typeof(TopLevel);foreach (var name in asmNames){Assembly? asm = null;try { asm = Assembly.Load(name); } catch { continue; }foreach (var t in asm.GetTypes())if (t.IsPublic && !t.IsAbstract &&controlType.IsAssignableFrom(t) &&!topLevel.IsAssignableFrom(t) &&!typeMap.ContainsKey(t.Name))typeMap[t.Name] = t;}lstTypes.ItemsSource = typeMap.Keys.OrderBy(n => n).ToList();}catch (Exception ex){txtTemplate.Text = "加载失败:" + ex.Message;}}private void lstTypes_SelectionChanged(object? sender, SelectionChangedEventArgs e){if (lstTypes.SelectedItem is not string name || !typeMap.TryGetValue(name, out var type))return;previewHost.Content = null;try{if (type.GetConstructor(Type.EmptyTypes)?.Invoke(null) is not Control control){txtTemplate.Text = $"<< 无法实例化 {name} >>";return;}// 如果控件具有 Content 属性,设置默认文本“预览Abc”var contentProp = type.GetProperty("Content", BindingFlags.Public | BindingFlags.Instance);if (contentProp != null && contentProp.CanWrite && contentProp.PropertyType == typeof(object))contentProp.SetValue(control, "预览Abc");// 将控件显示在预览区previewHost.Content = control;control.Arrange(new Rect(control.DesiredSize));control.UpdateLayout();var sb = new StringBuilder();sb.AppendLine($"🔹 {type.FullName}, {type.Assembly.GetName().Name}");sb.AppendLine("──────── 模板(视觉树结构) ────────");if (control is TemplatedControl templated && templated.Template != null){var root = templated.Template.Build(templated)!.Result;// 内联递归打印结构void print(Control c, int d){sb.AppendLine(new string(' ', d * 2) + c.GetType().Name);if (c is Panel p) foreach (var child in p.Children) print(child, d + 1);else if (c is ContentControl cc && cc.Content is Control c1) print(c1, d + 1);else if (c is Decorator dc && dc.Child is Control c2) print(c2, d + 1);}print(root, 0);}else{sb.AppendLine("<< 控件不是 TemplatedControl 或模板为空 >>");}txtTemplate.Text = sb.ToString();}catch (Exception ex){txtTemplate.Text = "<< 出错: " + ex.Message + " >>";}}
}

运行效果

 

http://www.hskmm.com/?act=detail&tid=38141

相关文章:

  • 字符调整
  • 2025年专业的云计算就业岗位,云计算就业技能培训
  • PostgreSQL技术大讲堂 - 第109讲:PG18新版本5大特性尝鲜
  • 10月第二篇笔记
  • 2025年知名的装修全包,装修定制公司
  • 2025年诚信的老板IP短视频代运营,城阳短视频代运营培训
  • 配置网站,nginx必须的一个步骤
  • 赋能智慧水利:视频汇聚平台EasyCVR智慧水利工程视频管理系统解决方案
  • 2025年比较好的智慧体育体测教室,智慧体育跑道哪家便宜
  • 10月24日
  • 2025年靠谱的黄蜡石鱼池假山制作,龟纹石鱼池假山制作厂家最新TOP推荐榜
  • 2025年10月远程控制软件推荐榜:节点小宝领衔十强对比评测
  • 2025年口碑好的外贸获客,中亚获客推广
  • 2025年评价高的服务器电源,服务器机箱厂家最新TOP推荐榜
  • 从汇聚到智能:解析视频融合平台EasyCVR视频智能分析技术背后的关键技术
  • 2025年知名的KNX智能家居品牌,KNX智能家居系统设计最新TOP排名厂家
  • 2025年杭州品牌策划公司最新推荐榜,聚焦企业服务品质与特色领域竞争力深度剖析
  • Docker、Docker-compose常用命令
  • 2025年10月短视频IP打造公司推荐榜:五强对比与选择指南
  • 2025年质量好的绿植租赁套餐,无锡办公室绿植租赁品牌厂家排行榜
  • 语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python) - 教程
  • 2025年中国房产律所推荐榜:深度解析北京金诉等十强所
  • 2025年知名的全品类全屋定制五金,成都全屋定制五金厂家推荐及选择建议
  • docker使用
  • 2025年质量好的厂区VI设计,10.画册VI设计最新TOP厂家推荐
  • 2025年质量好的工作餐团餐配送,工厂团餐配送推荐及选择建议
  • 2025年10月道闸厂家推荐榜:五强对比与选购指南
  • AI优化企业:AI优化公司榜单推荐
  • 2025年质量好的房屋加固如何选
  • 2025年质量好的房屋检测鉴定选哪家