В моем .NET8
MAUI
приложении есть много страниц с одним и тем же кодом XAML и кодом позади него. Например, у меня есть реклама внизу страниц XAML, и я использую тот же код для удаления пробела из командной строки.
Я нашел много примеров с кодом BasePage
на C#, но ни один из них не имел отношения к XAML. Мне нравится иметь только 1 BasePage
, где я управляю рекламой, а затем добавляю контент на другие страницы. Например:
<?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:ads = "clr-namespace:Plugin.MauiMTAdmob.Controls;assembly=Plugin.MauiMTAdmob"
x:Class = "LanguageInUse.Views.BasePage"
Title = "BasePage">
<Grid HorizontalOptions = "FillAndExpand" VerticalOptions = "FillAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition Height = "*" />
<RowDefinition Height = "Auto" />
</Grid.RowDefinitions>
<VerticalStackLayout x:Name = "First"></VerticalStackLayout>
<VerticalStackLayout x:Name = "Second"></VerticalStackLayout>
<VerticalStackLayout
Grid.Row = "2"
Margin = "0,5,0,0"
BackgroundColor = "AliceBlue"
HorizontalOptions = "FillAndExpand"
VerticalOptions = "FillAndExpand">
<ads:MTAdView
x:Name = "ads"
AdSize = "AnchoredAdaptive"
AdsId = "{Binding AdsId}"
IsVisible = "true" />
</VerticalStackLayout>
</Grid>
</ContentPage>
Итак, на странице, которая наследуется от BasePage
, мне нравится добавлять XAML в раздел First
или Second
. Я не уверен, что смогу это сделать. Есть ли пример? Возможно ли это сделать?
<ContentPage
x:Class = "MauiSamples.Views.BasePage"
xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml">
<ContentPage.ControlTemplate>
<ControlTemplate>
<Grid RowDefinitions = "250,*,250">
<Label
Grid.Row = "0"
FontSize = "Title"
HorizontalOptions = "Center"
Text = "Header"
VerticalOptions = "Center" />
<ContentPresenter Grid.Row = "1" />
<Label
Grid.Row = "2"
FontSize = "Title"
HorizontalOptions = "Center"
Text = "Footer"
VerticalOptions = "Center" />
</Grid>
</ControlTemplate>
</ContentPage.ControlTemplate>
</ContentPage>
Создайте новую страницу, которая наследуется от BasePage
, и добавьте контент так же, как для любой другой страницы или представления:
<views:BasePage
x:Class = "MauiSamples.Views.PageWithBase"
xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views = "clr-namespace:MauiSamples.Views">
<Grid>
<Label
FontSize = "Title"
HorizontalOptions = "Center"
Text = "Hello from Page"
VerticalOptions = "Center" />
</Grid>
</views:BasePage>
Обратите внимание, что корень не должен быть ContentPage
, а должен быть вашим BasePage
.
Важно, чтобы любая страница, использующая ваш BasePage
, также наследовала от BasePage
в коде программной части:
public partial class PageWithBase : BasePage
{
public PageWithBase()
{
InitializeComponent();
}
}
Также обратите внимание, что вы можете использовать только один экземпляр <ContentPresenter />
для каждого просмотра или страницы, которую хотите использовать в качестве основы. Во всех остальных случаях вам необходимо определить свойства типа <ContentView />
.
Вы можете увидеть рабочий пример в моем репозитории MAUI Samples.
Спасибо за ваш ответ. У вас есть пример использования ContentView
? Как я могу связать значения в ControlTemplate
?
Для этого вам нужно использовать TemplateBinding.
Думаю, вы могли бы использовать ContentPresenter Learn.microsoft.com/en-us/dotnet/maui/fundamentals/…