You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Maui自定义页面继承:如何保留父模板元素?

解决MAUI中ControlTemplate继承时保留父模板内容的问题

问题根源在于:当你在Page2中重新赋值Controls:Page1.ControlTemplate时,是完全替换了Page1原本的ControlTemplate,而非扩展它,因此Page1模板里的Label1被覆盖,仅显示Page2新增的Label2。

以下是两种可行的解决方案:


方案一:提取公共模板内容到ContentView(推荐)

将Page1模板中的公共内容提取为独立的ContentView,让Page1和Page2都复用这个组件,同时Page2可以在模板中添加自定义元素。

步骤1:创建Page1TemplateContent.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.Resources.Controls.Page1TemplateContent">
    <Grid RowDefinitions="auto,*">
        <!-- Page1的核心模板内容 -->
        <Label Text="Label 1" Grid.Row="0"/>
        <ContentPresenter Grid.Row="1" />
    </Grid>
</ContentView>

步骤2:修改Page1.xaml,复用ContentView

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:Controls="clr-namespace:MyApp.Resources.Controls"
             x:Class="MyApp.Resources.Controls.Page1"             
             Title="Page1">
    <ContentPage.ControlTemplate>
        <ControlTemplate>
            <Controls:Page1TemplateContent/>
        </ControlTemplate>
    </ContentPage.ControlTemplate>
</ContentPage>

步骤3:修改Page2.xaml,包含公共模板并添加自定义元素

<?xml version="1.0" encoding="utf-8" ?>
<Controls:Page1 xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:Controls="clr-namespace:MyApp.Resources.Controls"
             x:Class="MyApp.Resources.Controls.Page2"               
             Title="Page2">
    <Controls:Page1.ControlTemplate>
        <ControlTemplate>
            <!-- 新增行来容纳Page2的Label,同时包含Page1的模板内容 -->
            <Grid RowDefinitions="auto,auto,*">
                <Label Text="Label 2" Grid.Row="0"/>
                <!-- 复用Page1的模板内容 -->
                <Controls:Page1TemplateContent Grid.Row="1" Grid.RowSpan="2"/>
            </Grid>
        </ControlTemplate>
    </Controls:Page1.ControlTemplate>
</Controls:Page1>

方案二:在Page2模板中直接复用Page1的模板代码

如果不想新增ContentView,可以直接在Page2的ControlTemplate中重新构建包含Page1内容的布局:

<?xml version="1.0" encoding="utf-8" ?>
<Controls:Page1 xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:Controls="clr-namespace:MyApp.Resources.Controls"
             x:Class="MyApp.Resources.Controls.Page2"               
             Title="Page2">
    <Controls:Page1.ControlTemplate>
        <ControlTemplate>
            <!-- 调整行定义,容纳两个Label -->
            <Grid RowDefinitions="auto,auto,*">
                <!-- Page1原有的Label -->
                <Label Text="Label 1" Grid.Row="0"/>
                <!-- Page2新增的Label -->
                <Label Text="Label 2" Grid.Row="1"/>
                <!-- 页面内容的占位符 -->
                <ContentPresenter Grid.Row="2"/>
            </Grid>
        </ControlTemplate>
    </Controls:Page1.ControlTemplate>
</Controls:Page1>

注意事项

原代码中存在未闭合的Label标签(如<Label Text="Label 1" Grid.Row="0">),请修正为自闭合标签<Label Text="Label 1" Grid.Row="0"/>,避免XAML解析错误。

内容的提问来源于stack exchange,提问作者Thomas Carlton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:25:25