Есть ли способ установить содержимое для StackLayout или Grid из StaticResource?

Глядя на свой 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
310
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо этого в 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>

И это все, я считаю это полезным!

Я выбрал это как ответ, так как более поздний опубликованный ответ был очень похож на этот, однако мне нравится этот, поскольку он объясняет, как добавить несколько дочерних элементов представления. Я, скорее всего, просто объединим их в представлении «Сетка» или «Стек», чтобы не использовать этот дополнительный код, но полезно знать это на будущее. Спасибо !

henda79 23.12.2020 12:03

Решение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

Другие вопросы по теме