MAUI 中的 TemplatedView 是创建可复用、样式可定制的模板化控件的核心方式,它不自带 UI,而是通过
ControlTemplate定义外观,再由子类(如自定义控件)绑定数据并渲染。关键在于“分离逻辑与样式”,适合封装带交互的组件(如卡片、开关、状态指示器等)。
一、创建 TemplatedView 子类
新建一个类继承
TemplatedView,声明可绑定的属性(如标题、图标、是否启用),并在构造函数中设置默认模板: 在类中定义
BindableProperty(例如
TitleProperty、
IsEnabledProperty) 重写
OnApplyTemplate()方法,在其中获取模板内命名元素(如
GetTemplateChild("TitleLabel"))并绑定逻辑或事件
模板本身暂不写死,留待 XAML 或样式中指定
二、定义 ControlTemplate 模板
模板通常写在资源字典(
Resources)里,用
ControlTemplate包裹布局,并通过
TemplateBinding绑定到 TemplatedView 的属性: 模板根元素必须是单个容器(如
Grid、
StackLayout) 使用
{TemplateBinding Title} 将子控件(如 Label)的
Text属性关联到 TemplatedView 的
Title属性 可配合
VisualStateManager响应状态变化(如
Disabled、
Pressed)
三、在页面中使用自定义 TemplatedView
先在 XAML 中声明命名空间,再像普通控件一样使用:
添加xmlns:local="clr-namespace:YourApp.Controls"插入自定义控件,设置绑定属性:
<customcard title="{Binding CardTitle}" isenabled="True"></customcard>
如需覆盖默认模板,可在控件内嵌套 ControlTemplate,或通过
Style统一设置
四、进阶技巧:支持主题切换与动态模板
TemplatedView 天然适配 MAUI 的主题机制:
在App.xaml的
ResourceDictionary.MergedDictionaries中分别定义
Light和
Dark模板资源 用
OnIdiom或
OnPlatform实现平台/设备差异模板 运行时通过
this.ControlTemplate = newTemplate;切换模板(注意触发
OnApplyTemplate)
基本上就这些。TemplatedView 不复杂但容易忽略
OnApplyTemplate的调用时机和
TemplateBinding的作用域限制——它只认 TemplatedView 及其父类的属性,不能跨级绑定。
