Inheritance 表单:用所有页面扩展CommonToolbarPage类的方法

Inheritance 表单:用所有页面扩展CommonToolbarPage类的方法,inheritance,xamarin,xamarin.forms,toolbaritems,Inheritance,Xamarin,Xamarin.forms,Toolbaritems,我正在xamarin forms应用程序中开发ToolbarItem。我需要在整个应用程序中设置ToolbarItem。为此,我创建了CommonToolbarPage类,并使用ContentPage进行扩展,以便在所有页面中使用。但是Main.xaml.cs页面是通过TabbedPage继承的。如何将CommonToolbarPage与主页一起使用。 下面是页面类代码 public class CommonToolbarPage : ContentPage { public C

我正在xamarin forms应用程序中开发
ToolbarItem
。我需要在整个应用程序中设置
ToolbarItem
。为此,我创建了
CommonToolbarPage
类,并使用
ContentPage
进行扩展,以便在所有页面中使用。但是
Main.xaml.cs
页面是通过
TabbedPage
继承的。如何将
CommonToolbarPage
与主页一起使用。 下面是页面类代码

public class CommonToolbarPage : ContentPage    
{
    public CommonToolbarPage()
        : base()
    {
        Init();
    }
    private void Init()
    {
        this.ToolbarItems.Add(new ToolbarItem() { Icon="kid", Priority = 0, Order = ToolbarItemOrder.Primary });
        this.ToolbarItems.Add(new ToolbarItem() { Text = "License", Priority = 0, Order = ToolbarItemOrder.Primary });           
    }
}
下面是
Mainpage.xaml.cs
class

 public partial class MainPage : TabbedPage
        {
            public MainPage()
            {
                InitializeComponent();
            }
        }
Mainpage.xaml在这里查看
Mykid

    <?xml version="1.0" encoding="utf-8" ?>
<CustomPages:CommonToolbarPage2  xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TabbedApp.MainPage"
             xmlns:CustomPages="clr-namespace:TabbedApp.CustomPages;assembly=TabbedApp"   
             xmlns:local="clr-namespace:TabbedApp">
    <local:DairyTabs Icon="dairy" HeightRequest="10" WidthRequest="10" ></local:DairyTabs>
    <local:Mykid Icon="kid" ></local:Mykid>
    <local:Event Icon="about"></local:Event>
</CustomPages:CommonToolbarPage2>
DiaryTab.xaml.cs(第一个选项卡第一页)

当我单击“转到第二页”按钮时,在没有工具栏项的情况下获得下面的输出(如果我没有继承所有页面文件循环页面) 请参见下面的屏幕截图


查看Xamarin论坛上的此帖子:

你的代码似乎完全合法。但是查找呈现程序
TabbedPage
,您不能继承
ContentPage
并将其应用于TabbedPage`。 您应该为此类页面创建一个新的基类:

public class CommonToolbarPage : TabbedPage
    {
        public CommonToolbarPage()
            : base()
        {
            Init();
        }

        private void Init()
        {
            this.ToolbarItems.Add(new ToolbarItem() { Text = "Help", Priority = 0, Order = ToolbarItemOrder.Secondary});
            this.ToolbarItems.Add(new ToolbarItem() { Text = "License", Priority = 0, Order = ToolbarItemOrder.Secondary });
            this.ToolbarItems.Add(new ToolbarItem() { Text = "About", Priority = 0, Order = ToolbarItemOrder.Secondary });
        }

    }    
如果您使用的是MVVM而不是CodeBehing开发方法,则可以bing工具栏项属性,XAML如下所示:

<ContentPage.ToolbarItems>
    <ToolbarItem Name="MenuItem1" Order="Primary" Icon="Microsoft.png" Text="Item 1" Priority="0" />
    <ToolbarItem Name="MenuItem2" Order="Primary" Icon="Xamarin.png" Text="Item 2" Priority="1" />
</ContentPage.ToolbarItems>

您将拥有一个基本视图模型,该模型将在构造函数中创建项,而不是静态地设置项


希望这对您有所帮助。

主页应该是选项卡式页面吗?如果不是,就把它改成一个内容页面,比如说,如果
Mainpage2.xaml.cs
是一个选项卡式页面,那么我将面临这个问题。为什么?因为除了选项卡(或每个页面)之外,我还需要
ToolbarItem
TabbedPage
继承自
MultiPage
ContentPage
来自
page
。当从
页面继承
CommonToolbarPage
类时,您可以尝试在heriting from Page中添加代码参见我的更新问题获取上述错误。您的建议值得实施。我仍然面临一个问题。当我转到第二个选项卡时,页面是
Mykid.xaml.cs
继承自
Contentpage
工具栏,它显示了4个选项卡。2个来自主页,另外2个来自同一页面(
CommonToolbarPage:ContentPage
)。请更准确地看我更新的问题。这是正常的,选项卡式页面是同一页面,您不调用所有生命周期页面。因此,在您的案例中,只有选项卡式页面需要该项。如果我没有激怒您,则不是选项卡式页面所使用的子页面:)。若我不将工具栏扩展到所有生命周期页面,我将面临另一个问题。请参阅我的更新问题以获得更多澄清。如果你需要任何澄清,可以告诉我关于上述变化,看看这个线程。似乎onappearing在tabbed页面中被调用了两次:但我仍然不知道如何解决这个问题。为什么?因为即使是我也没有覆盖出现的
。如果我重写我将在那里编写的代码。
public class CommonToolbarPage : TabbedPage
    {
        public CommonToolbarPage()
            : base()
        {
            Init();
        }

        private void Init()
        {
            this.ToolbarItems.Add(new ToolbarItem() { Text = "Help", Priority = 0, Order = ToolbarItemOrder.Secondary});
            this.ToolbarItems.Add(new ToolbarItem() { Text = "License", Priority = 0, Order = ToolbarItemOrder.Secondary });
            this.ToolbarItems.Add(new ToolbarItem() { Text = "About", Priority = 0, Order = ToolbarItemOrder.Secondary });
        }

    }    
<ContentPage.ToolbarItems>
    <ToolbarItem Name="MenuItem1" Order="Primary" Icon="Microsoft.png" Text="Item 1" Priority="0" />
    <ToolbarItem Name="MenuItem2" Order="Primary" Icon="Xamarin.png" Text="Item 2" Priority="1" />
</ContentPage.ToolbarItems>