Пользовательский Renderer для NavtigationPage вызывает "requestLayout () неправильно вызван" - PullRequest
0 голосов
/ 17 апреля 2020

Я написал пользовательский рендер для NavigationPage, чтобы сбросить значок гамбургера / меню со своим собственным значком. Я разместил созданный значок во всех папках mdpi, hdpi, .... При создании приложения на самом деле выбирается довольно большая версия иконки, и поэтому вызывается requestLayout().

Любые предложения по избежанию этой топики c, поскольку это вызывает некоторые проблемы с производительностью.

Вот мой пользовательский рендер:

public class IconNavigationPageRenderer : NavigationPageRenderer
{
    public IconNavigationPageRenderer(Context context) : base(context)
    {

    }

    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 Android.Widget.ImageButton;

                imageButton?.SetMaxHeight(toolbar.Height);
                Android.Graphics.Drawables.Drawable dr = Context.GetDrawable(Resource.Drawable.Icon_black);
                if (imageButton?.Drawable.GetHashCode() == dr.GetHashCode())
                    continue;

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

                imageButton.SetImageDrawable(dr);
            }
        }
    }
}

1 Ответ

0 голосов
/ 18 апреля 2020

Я думаю, что вам нужно это TitleView .

Очень просто использовать и настраивать:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             x:Class="NavigationPageTitleView.AndroidExtendedTitleViewPage">
    <NavigationPage.TitleView>
        <StackLayout>
            <Label Text="My TitleView" Style="{DynamicResource TitleStyle}" />
            <SearchBar />
        </StackLayout>
    </NavigationPage.TitleView>
    <StackLayout Margin="20">
        <Label Text="The TitleView on the NavigationPage has a BarHeight of 450." />
        <Button Text="Return to Menu" Clicked="OnReturnButtonClicked" />    
    </StackLayout>    
</ContentPage>

Надеюсь, это поможет.

...