Глядя на свой XAML, я замечаю области, которые в основном дублируют друг друга, и, поскольку мне нравится содержать их в чистоте, я подумал, есть ли способ уменьшить дублирующийся код в XAML.
Итак, что я хочу сделать, так это установить Content для элемента управления, такого как StackLayout, Grid, Frame и т. д.
Я создал ресурс уровня страницы, но не знаю, как его использовать.
<ContentPage.Resources>
<StackLayout x:Key = "CommonDetails">
<Label Text = "First Name"/>
<Label Text = "Last Name"/>
</StackLayout>
</ContentPage.Resources>
<StackLayout>
<CommonDetails>
<Label Text = "Extra Uncommon Data"/>
</StackLayout>
<StackLayout>
<CommonDetails>
<Label Text = "Extra Uncommon Data"/>
<Label Text = "Extra Uncommon Data"/>
<Label Text = "Extra Uncommon Data"/>
</StackLayout>





Вместо этого в Resources вы можете определить ControlTemplete:
<ContentPage.Resources>
<ControlTemplate x:Key = "commonDetails">
<StackLayout>
<Label Text = "First Name"/>
<Label Text = "Last Name"/>
<ContentPresenter/>
</StackLayout>
</ControlTemplate>
</ContentPage.Resources>
И здесь начинается сложная часть, так как для того, чтобы потреблять это, вам понадобится ContentView, но в вашем случае «обычный» ContentView не подойдет, так как они принимают только один child: вам придется создать специальный ContentView, который принимает несколько просмотров.
Вы делаете это следующим образом:
// Overriding the ContentProperty allows you
// to have a ContentView that accepts multiple childs.
[Xamarin.Forms.ContentProperty("Contents")]
public class View1 : ContentView
{
StackLayout contentStack { get; } = new StackLayout();
public IList<View> Contents { get => contentStack.Children; }
public View1()
{
Content = contentStack;
}
}
И с этим в руках, остальное действительно просто, так как в любом Page вы можете определить пользовательский ControlTemplate и установить его на свой специальный ContentView, как показано ниже.
<local:View1 ControlTemplate = "{StaticResource commonDetails}">
<Label Text = "Occupation1"/>
<Label Text = "Occupation2"/>
</local:View1>
И это все, я считаю это полезным!
Решение1:
Вы можете использовать шаблон управления.
<!-- Grid Template -->
<ControlTemplate x:Key = "GridTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ContentPresenter Grid.Row = "0" />
<Label
Grid.Row = "1"
BackgroundColor = "Accent"
Text = "Grid Template" />
</Grid>
</ControlTemplate>
Если вы хотите связать значение шаблона на странице различий, вы можете использовать TemplateBinding.
<ControlTemplate x:Key = "GridTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ContentPresenter Grid.Row = "0" />
<Label Grid.Row = "1" BackgroundColor = "Accent" Text = "{TemplateBinding BindingContext.Name}" />
</Grid>
</ControlTemplate>
Для получения более подробной информации с образцом кода вы можете проверить код, который я сделал ранее. Как добавить представление сетки на страницу сведений Master-Detail в Xamarin Forms?
Решение2:
Простым способом является использование пользовательского элемента управления в качестве модели.
Вы можете проверить образец по ссылке ниже. https://stackoverflow.com/a/58928433/11850033
Я выбрал это как ответ, так как более поздний опубликованный ответ был очень похож на этот, однако мне нравится этот, поскольку он объясняет, как добавить несколько дочерних элементов представления. Я, скорее всего, просто объединим их в представлении «Сетка» или «Стек», чтобы не использовать этот дополнительный код, но полезно знать это на будущее. Спасибо !