我有一个Xamarin Forms应用程序,我想在每个页面上放置一个标准(子)标题。子标题将包含一个标签,该标签将针对每个页面和可选的后退按钮进行更改,并且将位于包含菜单汉堡包和应用程序名称的App Header下方。
最初我创建了一个“HeaderPage”,其中包含标准控件的布局,以及从该页面继承的所有页面。我“隐藏”了ContentPage.Content,因此从HeaderPage继承的页面可以设置Content =来设置HeaderPage内容
private ContentView _headerPageContent;
public new View Content
{
set { _headerPageContent.Content = value; }
}
并且子页面只需设置文本:
HeaderLabel = "Contact Us";
这种方法很有效,直到表单2.1中删除了掩盖ContentPage.Content的能力。
当时建议使用带有标题的ControlTemplate的ContentPage。我和我的一位同事一样探索了这条道路,我们都退缩了,因为代码的复杂性和重复性将绑定放在每一页上。
我已经考虑过将标题作为一个视图,或者研究如何使其成为一个控件。
现在我采取了简单的方法,将“Content”变量重命名为“HeaderPageContent”,以便从Header页面继承的所有页面都设置HeaderPageContent而不是Content。
有没有其他人做过类似的事情?你发现了什么?
答案 0 :(得分:0)
我在我的应用上遇到了同样的问题,并找到了与您类似的解决方案。
创建一个继承自PageBase
Xamarin.Forms.Page
类
- In that class create a `property` named `PageContent` typeof `View`.(Content will be there)
- (optional)Override the default attribute for class: `[Xamarin.Forms.ContentProperty("PageContent")]` so you will not be have to annotate into xaml each time.
- Override `OnParentSet` method like you want to style the page.
样本班级&使用强>
// PageBase Class
namespace Test.Views.Base
{
[Xamarin.Forms.ContentProperty("PageContent")]
public class PageBase: Xamarin.Foorms.Page
{
private Grid _mainLayout;
private Label _headerLabel;
private Label _footerLabel;
public View PageContent{get;set;}
public string HeaderText{get;set;} // you can make this property bindable
public string FooterText{get;set;} // you can make this property bindable
public PageBase():base()
{
_mainLayout = new Grid();
_mainLayout.RowDefinitions.Add(new RowDefinition(){Height= new GridLenght(50, GridUnitType.Absolute)}); //Header
_mainLayout.RowDefinitions.Add(new RowDefinition(){Height= new GridLenght(1, GridUnitType.Star)}); //Content
_mainLayout.RowDefinitions.Add(new RowDefinition(){Height= new GridLenght(50, GridUnitType.Absolute)}); //Footer
_headerLabel = new Label();
_footerLabel = new Label();
_mainLayout.Children.Add(_headerLabel);
_mainLayout.Children.Add(_footerLabel);
Grid.SetRow(_footerLabel,2);
}
protected override void OnParentSet()
{
base.OnParentSet();
if(PageContent != null)
{
_mainLayout.Children.Add(PageContent);
Grid.SetRow(PageContent,1);
this.Content= _mainLayout;
}
_headerLabel.Text = HeaderText;
_footerLabel.Text = FooterText;
}
}
}
这是Xaml
<?xml version="1.0" encoding="utf-8" ?>
<local:PageBase xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Test.Views.Base;assembly=Test"
xmlns:cell="clr-namespace:Test.Views;assembly=Test"
x:Class="Test.Views.TestPage"
HeaderText="Page Header"
FooterText="Page Footer"
>
<local:PageBase.PageContent>
<!-- Here Goes Page Content -->
</local:PageBase.PageContent>
</local:PageBase>