[Xamarin.Forms] [Android]更改导航中的后退和下一个颜色

时间:2017-08-20 18:33:44

标签: xamarin xamarin.android xamarin.forms

我'有一些导航页面,我想覆盖后退按钮的颜色和我的下一个按钮( ToolbarItem

我已尝试 BarTextColor 属性,但它会更改所有导航标题文字的颜色。

它在内部监督办公室完成,但我'无法找到Android的解决方案。

它适用于标题,但不适用于图标。

这是我的代码:

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged(sender, e);

    var page = this.Element as NavigationPage;
    if (page != null && toolbar != null)
    {
        toolbar.SetTitleTextColor(Color.Black.ToAndroid());

        if (toolbar.NavigationIcon != null)
            toolbar.NavigationIcon.SetColorFilter(Color.Green.ToAndroid(), Android.Graphics.PorterDuff.Mode.Multiply);

        if (toolbar.OverflowIcon != null)
            toolbar.OverflowIcon.SetColorFilter(Color.Green.ToAndroid(), Android.Graphics.PorterDuff.Mode.Multiply);
    }    
}

1 个答案:

答案 0 :(得分:2)

  

我有一些导航页面,我想覆盖后退按钮和下一个按钮(ToolbarItem)的颜色

您的下一个按钮是ToolbarItem,由您自己定义。所以定制它不会有问题。困难的部分在于后退按钮,因为它由Xamarin.Forms提供。您需要覆盖NavigationPageRenderer以更改颜色:

public class MyNavigationPageRenderer : NavigationPageRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
    {
        base.OnElementChanged(e);
        if (e.NewElement != null)
        {
            var navController = (INavigationPageController)e.NewElement;
            navController.PushRequested += NavController_PushRequested;
            navController.PopRequested += NavController_PopRequested;
        }
    }

    private void NavController_PopRequested(object sender, Xamarin.Forms.Internals.NavigationRequestedEventArgs e)
    {
        Device.StartTimer(TimeSpan.FromMilliseconds(220), () =>
        {
            ChangeIconColor();
            return false;
        });
    }

    private void NavController_PushRequested(object sender, Xamarin.Forms.Internals.NavigationRequestedEventArgs e)
    {
        ChangeIconColor();
    }

    private void ChangeIconColor()
    {
        int count = this.ViewGroup.ChildCount;

        var toolbar = GetToolbar();

        if (toolbar.NavigationIcon != null)
        {
            var drawable = (toolbar.NavigationIcon as DrawerArrowDrawable);
            drawable.Color = Resource.Color.material_grey_850;//set the navigation icon color here
        }
    }

    private AToolbar GetToolbar()
    {
        for (int i = 0; i < this.ViewGroup.ChildCount; i++)
        {
            var child = this.ViewGroup.GetChildAt(i);
            if (child is AToolbar)
            {
                return (AToolbar)child;
            }
        }

        return null;
    }
}

对上述代码的一点解释:当您将新页面推送到导航页面时,PushRequestPopRequest会触发,这是您自定义现有工具栏的最佳时间{{ 1}}。因此,首先使用NavigationIcon找到工具栏,然后按GetToolbar更改图标颜色。