xamarin形成app子标题

时间:2016-05-24 20:21:31

标签: xamarin xamarin.forms heading

我有一个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。

有没有其他人做过类似的事情?你发现了什么?

1 个答案:

答案 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>