Xamarin.Forms - 有"include" 部分视图的机制吗?
Xamarin.Forms - Is there a mechanism to "include" a partial view?
Xamarin.Forms有包含的概念吗?
我正在创建一个跨所有页面共享 header 的应用。有没有办法创建一次 header 并将其包含在所有页面上?更好的是,有没有一种方法可以创建模板或可重复使用的布局,您可以将每个页面的所有内容放入其中?它与 .NET MVC 的 _Layout
文件的概念类似。
是的。您可以为此使用用户控件。您可以使用 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
继承并添加您的常用元素,并使用您继承的页面作为页面的基础 class。
模板化页面 - Xamarin.Forms 2.1
他们在 Xamarin.Forms 2.1 中引入了 TemplatedPage
。您可以在此处找到示例:http://xfcomplete.net/general/2016/01/20/control-templates/。带有 ContentPresenter
的 LoginView
示例完全符合您的情况。
你需要的是2.1.0引入的ControlTemplate
在 Application.Resources 中的 ResourceDictionary 中创建控件模板。
<?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/
Xamarin.Forms有包含的概念吗?
我正在创建一个跨所有页面共享 header 的应用。有没有办法创建一次 header 并将其包含在所有页面上?更好的是,有没有一种方法可以创建模板或可重复使用的布局,您可以将每个页面的所有内容放入其中?它与 .NET MVC 的 _Layout
文件的概念类似。
是的。您可以为此使用用户控件。您可以使用 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
继承并添加您的常用元素,并使用您继承的页面作为页面的基础 class。
模板化页面 - Xamarin.Forms 2.1
他们在 Xamarin.Forms 2.1 中引入了 TemplatedPage
。您可以在此处找到示例:http://xfcomplete.net/general/2016/01/20/control-templates/。带有 ContentPresenter
的 LoginView
示例完全符合您的情况。
你需要的是2.1.0引入的ControlTemplate
在 Application.Resources 中的 ResourceDictionary 中创建控件模板。
<?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/