xamarin 自定义导航栏

xamarin custom navigation bar

我尝试在导航栏中添加搜索栏。我用这段代码做到了:

public class NavigationSearchRenderer : PageRenderer
{
    private SearchView _searchView;
    public NavigationSearchRenderer(Context context) : base(context)
    {

    }
    protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
    {
        base.OnElementChanged(e);

        var navPage = Element as NavigationSearchPage;
        if (navPage == null)
            return;

        var activity = this.Context as FormsAppCompatActivity;
        if (activity == null)
            return;

        var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
        _searchView = new SearchView(Context);
        toolbar.AddView(_searchView);
    }

}

它有效,但现在所有导航栏都有搜索栏,我只想要从 NavigationSearchPage 继承的页面。

我也这样表示导出:

[assembly: ExportRenderer(typeof(NavigationSearchPage), typeof(NavigationSearchRenderer))]

It works but now all navigations bar have the search bar and I want only pages who inherit from NavigationSearchPage.

您的所有页面都有搜索栏,因为当您导航时,NavigationPage 永远不会刷新。并且由于您的渲染器仅将 SearchView 添加到工具栏并且从不清除它。您添加的 SearchView 将始终存在。

解法:

  1. 修改此渲染器以渲染项目中的所有页面,您可以使用超级 class 作为 ExportRenderer 的第一个参数。例如,如果您所有的页面都是 ContentPage 类型,那么像这样注册您的渲染器:

    [assembly:ExportRenderer(typeof(ContentPage),
      typeof(NavigationSearchRenderer))]
    
  2. 修改您的 OnElementChanged 以在 NavigationSearchPage 时添加 SearchView 并在其他页面时清除 SearchView

    protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
    {
        base.OnElementChanged(e);
    
        var activity = this.Context as FormsAppCompatActivity;
        if (activity == null)
            return;
    
        if (Element is NavigationSearchPage)
        {
            var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            _searchView = new SearchView(Context);
            toolbar.AddView(_searchView);
        }
        else
        {
            var page = (Element as ContentPage);
            if (page == null)
            {
                return;
            }
            var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            int count = toolbar.ChildCount;
            for (int i = 0; i < count; i++)
            {
                Android.Views.View child =toolbar.GetChildAt(i);
                if (child is SearchView)
                {
                    toolbar.RemoveView(child);
                }
            }
        }
    }