contentView с собственным и заданным содержимым

#xaml #xamarin #xamarin.forms #nested #contentview

#xaml #xamarin #xamarin.формы #вложенный #просмотр содержимого

Вопрос:

В приложении у меня есть два ContentView элемента управления, которые я пытаюсь создать на верхнем уровне ContentPage . Первый, ScaffoldView , содержит некоторые элементы макета, которые я хочу иметь во всем приложении:

 <?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App.ScaffoldView">
    <ContentView.Content>
        <Grid
            Margin="10,35,10,10"
            VerticalOptions="FillAndExpand">
            <Grid.RowDefinitions>...</Grid.RowDefinitions>
            <!-- Awesome header stuff -->
            <!-- I'd like the below to take given content -->
            <ContentView
                Grid.Row="..."
                Content="{Binding Content}" />
            <!-- Even more awesome footer stuff -->
        </Grid>
    </ContentView.Content>
</ContentView>
 

Второй, InputsView , содержит всего несколько пар элементов Label / Entry :

 <?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App.InputsView">
    <ContentView.Content>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Label Text="Label1"
                   FontSize="Medium"
                   VerticalTextAlignment="Center"
                   HorizontalTextAlignment="End" />
            <Entry Grid.Column="1"
                   Text="Input1"
                   VerticalOptions="Center" />
            <Label Grid.Row="1"
                   Text="Label2"
                   FontSize="Medium"
                   VerticalTextAlignment="Center"
                   HorizontalTextAlignment="End" />
            <Entry Grid.Row="1"
                   Grid.Column="1"
                   Text="Input2"
                   VerticalOptions="Center" />
            <Label Grid.Row="2"
                   Text="Label3"
                   FontSize="Medium"
                   VerticalTextAlignment="Center"
                   HorizontalTextAlignment="End" />
            <Entry Grid.Row="2"
                   Grid.Column="1"
                   Text="Input3"
                   VerticalOptions="Center" />
        </Grid>
    </ContentView.Content>
</ContentView>
 

Наконец, верхний уровень ContentPage :

 <?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="clr-namespace:App"
             x:Class="App.MainPage">
    <controls:ScaffoldView>
        <controls:InputsView />
    </controls:ScaffoldView>
</ContentPage>
 

В настоящее время все, что показывает, это InputsView . Я полагаю, это происходит только потому, что все Content содержимое MainPage занято ScaffoldView , а все Content ScaffoldView , как определено в Scaffold.xaml , переопределяется <controls:InputsView /> тегом.

В идеале, я бы хотел, чтобы был какой-то способ включения <controls:InputsView /> внутри открывающих и закрывающих <controls:ScaffoldView> тегов, как указано выше, и он показывал это заданное содержимое внутри ScaffoldView собственного содержимого, определенного внутри Scaffold.xaml .

Возможно ли вложить / смешать Content таким образом, или мне нужно будет определить пользовательское свойство, например ChildContent ?

Комментарии:

1. ScaffoldView В вашем случае это будет свойство содержимого, InputsView поскольку вы переопределили уже определенное (внутри вашего ScaffoldView.xaml) при использовании (путем вложения). по умолчанию вложение contentView = присвоение ему свойства содержимого.

2. требуется ли вам вложение, как вы описали, или вы проявляете гибкость?

3. Я могу быть гибким, хотя для привязки данных было бы лучше, если бы он был вложенным. Я думаю, я мог бы попробовать посмотреть, что StackLayout происходит с его Children собственностью.

4. @Bondolin Похоже, что ControlTemplate с помощью ContentPresenter может вам помочь.