Xamarin.Forms — есть ли механизм включения частичного представления?

Есть ли в Xamarin.Forms концепция включений?

Я создаю приложение с общим заголовком на всех страницах. Есть ли способ создать заголовок один раз и включить его на все страницы? Еще лучше, есть ли способ создать шаблон или повторно используемый макет, в который вы можете поместить весь контент для каждой страницы? Это было бы аналогично концепции файла _Layout .NET MVC.


person jbyrd    schedule 24.03.2016    source источник


Ответы (2)


Вам нужен шаблон ControlTemplate, представленный в версии 2.1.0.

Создайте шаблон элемента управления в ResourceDictionary в Application.Resources.

<?xml version="1.0" encoding="utf-8" ?>
<Application
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="Mobile.App">
  <Application.Resources>
    <ResourceDictionary>
      <ControlTemplate x:Key="MainPageTemplate">
        <StackLayout>
          <Label Text="Header Content" FontSize="24" />         
          <ContentPresenter />
        </StackLayout>
      </ControlTemplate>
    </ResourceDictionary>
  </Application.Resources>
</Application>

Затем в вашем ContentPage назначен ControlTemplate

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
               xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
               x:Class="Mobile.MainPage"
               ControlTemplate="{StaticResource MainPageTemplate}">

  <Label Text="Main Page Content" FontSize="18" />

</ContentPage>

Тогда вы закончите с

введите описание изображения здесь

Ссылка на: http://www.xamarinhelp.com/xamarin-forms-page-templates/

person Adam    schedule 20.04.2016
comment
Если я применяю шаблон элемента управления на уровне страницы, а не на уровне приложения, могут ли производные классы использовать этот шаблон элемента управления? - person Mark13426; 31.07.2016
comment
@jbyrd - я не пробовал, но вы сможете. Создайте новый ControlTemplate() и добавьте элементы управления. Затем назначьте его свойству ControlTemplate на странице. - person Adam; 22.12.2017

Да. Для этого вы можете использовать пользовательские элементы управления. Вы можете использовать только XAML или код. Я объясню способ XAML.

Просто добавьте новую страницу XAML и измените корневой тип с ContentPage на StackLayout. Корневым типом может быть любой другой макет или элемент управления. Вы должны решить, что подходит лучше всего.

MyControl.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="App6.MyControl">
    <Label Text="{Binding Name}" />
    <Label Text="{Binding Age}" />
    <Label Text="{Binding CatAmount}" />
</StackLayout>

Мы привязываем свойства Name, Age, CatAmount к трем разным меткам. Предположим, что BindingContext этого элемента управления является объектом типа PersonData (см. ниже). В вашем коде вы также должны изменить тип.

MyControl.xaml.cs

public partial class MyControl : StackLayout
{
    public MyControl()
    {
        InitializeComponent();
    }
}

На вашей странице вы должны добавить новое пространство имен (например, local, которое указывает на вашу сборку, например, App6 или MyApp.Whatever). Затем вы можете использовать его через local:MyControl. В нашем примере элемента управления мы привязываем BindingContext к Person, которое является свойством BindingContext нашей страницы, то есть (в нашем случае) самой страницей. Если ваш элемент управления находится в подпространстве имен, вы должны соответствующим образом изменить часть пространства имен.

Page2.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:local="clr-namespace:App6;assembly=App6"
             x:Class="App6.Page2">
    <local:MyControl BindingContext="{Binding Person}"></local:MyControl>
</ContentPage>

Page2.xaml.cs

public class PersonData
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int CatAmount { get; set; }
}

public partial class Page2 : ContentPage
{
    public PersonData Person { get; set; }

    public Page2()
    {
        Person = new PersonData {Age = 28, Name = "Sven", CatAmount = 2};
        InitializeComponent();
        BindingContext = this;
    }
}

И в упомянутом вами Сценарии вы можете просто наследоваться от ContentPage и добавлять свои общие элементы и использовать унаследованную вами страницу в качестве базового класса ваших страниц.

Шаблон страницы — Xamarin.Forms 2.1

В Xamarin.Forms 2.1 они представили TemplatedPage. Пример вы найдете здесь: http://xfcomplete.net/general/2016/01/20/control-templates/ . Пример LoginView с ContentPresenter точно соответствует вашему сценарию.

person Sven-Michael Stübe    schedule 24.03.2016