Xamarin Forms如何制作全局工具栏?

时间:2019-03-19 12:01:12

标签: c# android ios xamarin.forms

我想使Global Toolbar可以在我的整个应用程序中访问。我正在使用MVVM模式。 我已经在我的app.xaml中尝试过此操作:

<Application.Resources>
        <ResourceDictionary>
                <ContentPage x:Key="BoloTool">
                    <ContentPage.ToolbarItems>
                        <ToolbarItem Name="MenuItem2" Order="Secondary" Text="Moje dane" Priority="1"/>
                        <ToolbarItem Name="MenuItem4" Order="Secondary" Text="Wyloguj" Priority="1"/>
                        <ToolbarItem Name="MenuItem4" Order="Secondary" Text="Do Strony Testowej" Priority="1"/>
                        <ToolbarItem Name="MenuItem4" Order="Secondary" Text="Checkout" Priority="1"/>
                    </ContentPage.ToolbarItems>
                </ContentPage>
        </ResourceDictionary>
    </Application.Resources>

在我的“ Page.xaml”之一中,我做到了:

<ContentPage.ToolbarItems>
    <ToolbarItem BindingContext="{StaticResource BoloTool}"/>
</ContentPage.ToolbarItems>

它可以编译,但工具栏上什么也没有显示,您可以听到咔嗒声,但是没有声音,没有“ 3点”

我还试图通过创建代码文件“ x.cs”来实现这一目标:

public class BoloToolbar : ContentPage
{
    public BoloToolbar()
        : 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 });
    }

}

并在我的视图模型中继承它:

公共类CartViewModel:BoloToolbar,INotifyPropertyChanged

但是它不起作用。我被卡住了,我该怎么办?

Ps。奇怪的是,某些教程中没有通用工具栏这样的通用工具。

1 个答案:

答案 0 :(得分:1)

我认为您有点缺乏Xamarin.Forms的核心概念。您应该花一些时间研究它们。

  

并在我的视图模型中继承它:

BoloToolbar类继承VM将无济于事。视图模型是绑定到您的视图/页面,但与之不同。您应该从BoloToolbar

得出您的实际页面
<myNameSpace:BoloToolbar x:Class="MyNamespace.MyPage" ...>
    <myNameSpace:BoloToolbar.Content>
        <!-- Your content goes here -->
    </myNameSpace:BoloToolbar.Content>
</myNameSpce:BoloToolbar>

别忘了,您必须更改

public class MyPage : ContentPage 
{
    // ...
}

public class MyPage : BoloToolbar
{
    // ..
}

在您的 MyPage.xaml.cs 中。

为什么第一个选项不起作用?

在您的 Application.xaml 中,在资源字典中定义一个ContentPage,然后尝试将其分配给另一页的ToolbarItem

<ContentPage.ToolbarItems>
    <ToolbarItem ... /> 
</ContentPage.ToolbarItems>

一个 ToolbarItem添加到您的页面。设置其BindingContext不会对此进行任何更改。此外,没有设置Text,也没有设置Icon,因此什么也不显示。

ToolbarItems被声明为IList<ToolbarItem>并且是只读的,因此,您将无法通过资源简单地设置ToolbarItems。在内部,它是ObservableCollection<ToolbarItem>,操作Page.ToolbarItems的唯一方法是添加ToolbarItem对象。因此,您将只能添加基类中的项目。