【问题标题】:Xamarin Forms How to make Global Toolbar?Xamarin Forms 如何制作全局工具栏?
【发布时间】:2019-03-19 12:01:12
【问题描述】:

我想制作可在我的整个应用程序中访问的全局工具栏。我使用 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

但它不起作用..我卡住了,我该怎么做?

附言。奇怪的是,一些教程中没有像全局工具栏这样常见的东西..

【问题讨论】:

    标签: c# android ios xamarin.forms


    【解决方案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&lt;ToolbarItem&gt; 并且是只读的,因此您不能简单地通过资源设置ToolbarItems。在内部,它是一个ObservableCollection&lt;ToolbarItem&gt;,操纵Page.ToolbarItems 的唯一方法是添加ToolbarItem 对象。因此,您将被限制从基类添加项目。

    【讨论】:

    • 它的工作非常感谢你!如何将这些工具栏项绑定到视图模型,以便我可以使用“命令”??
    • 好的,我已经做到了。ToolbarItems.Add(new ToolbarItem("Moje Zamówienia", null, () => { }, ToolbarItemOrder.Secondary, priority:0));其中 null 是图像
    • This answer 解释了如何从代码中设置绑定。
    • 还有一个问题,你知道如何“刷新”工具栏视图吗?我正在检查客户端是否已登录,如果我向他显示不同的工具栏项目,但如果我登录并返回同一页面,它不会“刷新”它们,就像它不会第二次检查是否已登录。在不同的页面正常(一旦登录并第一次打开差异页面)
    • @Bolo:您何时以及如何检查用户是否登录?
    猜你喜欢
    • 2020-10-18
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多