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 将始终存在。
解法:
修改此渲染器以渲染项目中的所有页面,您可以使用超级 class 作为 ExportRenderer
的第一个参数。例如,如果您所有的页面都是 ContentPage
类型,那么像这样注册您的渲染器:
[assembly:ExportRenderer(typeof(ContentPage),
typeof(NavigationSearchRenderer))]
修改您的 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);
}
}
}
}
我尝试在导航栏中添加搜索栏。我用这段代码做到了:
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 将始终存在。
解法:
修改此渲染器以渲染项目中的所有页面,您可以使用超级 class 作为
ExportRenderer
的第一个参数。例如,如果您所有的页面都是ContentPage
类型,那么像这样注册您的渲染器:[assembly:ExportRenderer(typeof(ContentPage), typeof(NavigationSearchRenderer))]
修改您的
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); } } } }