Xamarin.Forms: могу ли я добавить один ContentPage или ContentView в другой контент?

У меня есть несколько Xaml файлов ContentPage в моем проекте Xamarin. Я хочу встроить общую часть xaml в каждый ContentPage. Нет ничего особенного в общей части xaml (не нужно делать какую-либо платформу). Разве это не так просто, как встраивание тега в xaml ContentPage для включения общего файла xaml? Может ли кто-нибудь указать мне в правильном направлении?

Ответ 1

Вы можете взять родительский дочерний элемент вашей ContentPage (например, StackLayout, охватывающий все дочерние элементы), поместить его во внешний файл xaml, а затем включить этот компонент в каждую из ваших ContentPages.

Внешний файл xaml будет иметь тип StackLayout, а не ContentPage.

Изменить - добавил пример кода:

Давайте добавим заголовок StackLayout: мы добавим код позади класса:

public partial class HeaderNavigationBar 
{
    public HeaderNavigationBar()
    {
        InitializeComponent();
    }
}

Затем добавьте код XAML:

<StackLayout x:Class="HeaderNavigationBar"
             Orientation="Horizontal"
             HorizontalOptions="FillAndExpand"
             Padding="10"
             BackgroundColor="White">

    <Image Source="burger_icon"
           HorizontalOptions="StartAndExpand"
           Aspect="AspectFit">
        <Image.GestureRecognizers>
            <TapGestureRecognizer Command="{Binding SlideNavigationDrawerCommand}" />
        </Image.GestureRecognizers>
    </Image>
</StackLayout>

И, наконец, на странице, где вы хотите повторно использовать свой компонент - добавьте эту ссылку: <HeaderNavigationBar/>.

Ответ 2

Большое спасибо, IdoT, у меня это сработало, но после добавления нескольких строк. Так как это поможет в создании шаблонов/пользовательских элементов управления/вложенных форм, легко добавляемых/передаваемых через Xamarin.Forms.

Вот моя полная работа, основанная на вашем предложении, поэтому она может быть использована как и другие:

HeaderNavigationBar.xaml

<?xml version="1.0" encoding="utf-8" ?>
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App9.MVC.Views.HeaderNavigationBar"
             Orientation="Horizontal"
             HorizontalOptions="FillAndExpand"
             Padding="10"
             ackgroundColor="White">

    <Button Text="Internal 1" />
    <Button Text="Internal 2" />
</StackLayout>

Как видите, добавлено:

xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

и в HeaderNavigationBar.cs он был объявлен как StackLayout:

HeaderNavigationBar.cs

using Xamarin.Forms;

namespace App9.MVC.Views
{
    public partial class HeaderNavigationBar : StackLayout
    {
        public HeaderNavigationBar()
        {
            InitializeComponent();
        }
    }
}

тогда для страницы, которая будет держать это/показать это:

MainView.xaml

<?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:common="clr-namespace:App9.MVC.Views;assembly=App9"
             x:Class="App9.MVC.Views.MainView">

    <StackLayout Padding="0,0,0,20">
        <common:HeaderNavigationBar>
            <Button Text="External 1" />
        </common:HeaderNavigationBar>

        <Button Text="Test Button 1
                x:Name="btnPage1"
                Clicked="btnPage1_clicked" />
    </StackLayout>
</ContentPage>

Как вы можете заметить, пространство имен имеет полный путь в MainView:

xmlns:common="clr-namespace:App9.MVC.Views;assembly=App9"

Кроме того, вы можете заметить, что есть кнопка с именем External 1, она также будет отображаться с кнопками Internal, поскольку элемент управления является StackLayout, поэтому он может обрабатывать добавление дополнительных элементов управления.

Скриншот:

enter image description here

Также для страницы внутри другой страницы:

Еще раз спасибо идет в IdoT.