更改主细节导航xamarin表单中的汉堡包图标

时间:2017-11-14 13:02:24

标签: xamarin.forms

我正在处理Xamarin表单,我需要在成功登录屏幕后显示主详细信息导航。我想更改默认的汉堡包图标,但无法更改它。

请参阅我正在使用的以下代码。

由于我的应用程序有登录屏幕,因此我不想在登录屏幕上显示任何导航。我只是在app.xaml.cs

中设置主页面
public App()
        {
            InitializeComponent();

            MainPage = new Login();
        }

现在点击登录后,我尝试按照方法更改图标但不起作用

  var dashboard = new Dashboard(){Icon = "Menuicon.png" };
    Application.Current.MainPage = dashboard;

Dashbaord是masterdetail页面,在我的ctor上,我正在设置详细页面如下

  Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(DashbaordDetail))) { Icon = "Menuicon.png" };

它没有反映新图标

2 个答案:

答案 0 :(得分:6)

您应该使用自定义渲染器。

在您的Android项目中,如下所示:

[assembly: ExportRenderer(typeof(CustomIcon.Views.MainPage), typeof(IconNavigationPageRenderer))]
namespace CustomIcon.Droid
{
    public class IconNavigationPageRenderer : MasterDetailPageRenderer
    {
        private static Android.Support.V7.Widget.Toolbar GetToolbar() => (CrossCurrentActivity.Current?.Activity as MainActivity)?.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);

        protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {
            base.OnLayout(changed, l, t, r, b);
            var toolbar = GetToolbar();
            if (toolbar != null)
            {
                for (var i = 0; i < toolbar.ChildCount; i++)
                {
                    var imageButton = toolbar.GetChildAt(i) as ImageButton;

                    var drawerArrow = imageButton?.Drawable as DrawerArrowDrawable; 
                    if (drawerArrow == null)
                        continue;

                    imageButton.SetImageDrawable(Forms.Context.GetDrawable(Resource.Drawable.newIcon));
                }
            }
        }
    }
}

在您的iOS项目中,只使用您PCL项目中xaml文件中的相同图标,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage  xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:CustomIcon.Views;assembly=CustomIcon"
         Title="MainPage"
         Icon="newIcon.png"
         x:Class="CustomIcon.Views.MainPage">
<MasterDetailPage.Master>
    <local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <local:Page1 />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

有关更多信息,请参阅我在github上的回购:https://github.com/wilsonvargas/CustomIconNavigationPage

答案 1 :(得分:3)

我做了这个调整,对我有帮助。现在导航后我也可以看到后退按钮

protected override void OnLayout(bool changed, int l, int t, int r, int b)
    {
        base.OnLayout(changed, l, t, r, b);
        var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
        if (toolbar != null)
        {

            for (var i = 0; i < toolbar.ChildCount; i++)
            {
                var imageButton = toolbar.GetChildAt(i) as ImageButton;
                var drawerArrow = imageButton?.Drawable as DrawerArrowDrawable;
                if (drawerArrow == null)
                    continue;

                bool displayBack = false;
                var app = Xamarin.Forms.Application.Current;

                var detailPage = (app.MainPage as MasterDetailPage).Detail;

                var navPageLevel = detailPage.Navigation.NavigationStack.Count;
                if (navPageLevel > 1)
                    displayBack = true;

                if (!displayBack)
                    ChangeIcon(imageButton, Resource.Drawable.iconMenu2);
                if (displayBack)
                    ChangeIcon(imageButton, Resource.Drawable.back1);
            }         
        }
    }

    private void ChangeIcon(ImageButton imageButton, int id)
    {
        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
            imageButton.SetImageDrawable(Context.GetDrawable(id));
        imageButton.SetImageResource(id);
    }
相关问题