最常用轻量方式是继承UserControl,适合封装已有控件;需完全控制模板、支持主题切换则应继承TemplatedControl;属性用AvaloniaProperty注册,使用需注意DefaultStyleKey和Generic.xaml路径约定。
最常用也最轻量的方式是继承 UserControl,适合封装一组已有控件并暴露少量属性和命令。新建一个 XAML 文件(如 MyButton.xaml),对应后台类继承 UserControl:
public static readonly StyledProperty TextProperty = AvaloniaProperty.Register(...) 定义可绑定的属性AddOwner 或直接在 XAML 中用 {Binding $parent[MyButton].Text} 关联逻辑如果需要完全控制模板、支持主题切换、响应样式变更,应继承 TemplatedControl(类似 WPF 的 Control)。它不带默认 XAML,所有 UI 都由 ControlTemplate 提供:
TemplatedControl,并在静态构造函数中调用 DefaultStyleKeyProperty.OverrideMetadata
Themes/Generic.xaml 中为该类型写默认模板,用 Temp
lateBinding 绑定到控件属性OnApplyTemplate() 获取模板中的命名元素(如 var part = this.GetTemplateChild("PART_Icon") as Image;)Avalonia 的属性系统基于 AvaloniaProperty,不是 .NET 的普通属性:
StyledProperty.Register("Name", defaultValue)
GetValue/SetValue),VS 可用代码片段 avprop 快速生成RoutedCommand 或用 RoutedEvent.Register 发布自定义事件自定义控件写完后,需在使用处声明 XML 命名空间,并像内置控件一样使用:
xmlns:local="using:MyApp.Controls"
Style 重写模板,或在 Generic.xaml 中统一设置默认样式;支持 :pointerover、:pressed 等伪类基本上就这些。不复杂但容易忽略的是 DefaultStyleKey 设置和 Generic.xaml 的路径约定——这两处错一个,模板就不会自动加载。