【发布时间】:2017-07-22 13:10:39
【问题描述】:
我正在开发一个 Xamarin.Forms Android-App,其中 ContentPage 上的 CustomRenderer 用于在页面的标题中显示 SearchView。 “SearchPage”类的 CustomRenderer 如下所示:
/// <summary>
/// The search page renderer.
/// </summary>
public class SearchPageRenderer : PageRenderer
{
/// <summary>
/// Gets or sets the search view.
/// </summary>
private SearchView searchView;
/// <summary>
/// Gets or sets the toolbar.
/// </summary>
private Toolbar toolbar;
/// <summary>
/// Reaction on the disposing of the page.
/// </summary>
/// <param name="disposing">A value indicating whether disposing.</param>
protected override void Dispose(bool disposing)
{
if (this.searchView != null)
{
this.searchView.QueryTextChange -= this.OnQueryTextChangeSearchView;
}
this.toolbar?.Menu?.RemoveItem(Resource.Menu.mainmenu);
base.Dispose(disposing);
}
/// <summary>
/// Reaction on the element changed event.
/// </summary>
/// <param name="e">The event argument.</param>
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
if (e?.NewElement == null || e.OldElement != null)
{
return;
}
this.AddSearchToToolBar();
}
/// <summary>
/// Adds a search item to the toolbar.
/// </summary>
private void AddSearchToToolBar()
{
this.toolbar = (CrossCurrentActivity.Current?.Activity as MainActivity)?.FindViewById<Toolbar>(Resource.Id.toolbar);
if (this.toolbar != null)
{
this.toolbar.Title = this.Element.Title;
this.toolbar.InflateMenu(Resource.Menu.mainmenu);
this.searchView = this.toolbar.Menu?.FindItem(Resource.Id.action_search)?.ActionView?.JavaCast<SearchView>();
if (this.searchView != null)
{
this.searchView.QueryTextChange += this.OnQueryTextChangeSearchView;
this.searchView.ImeOptions = (int)ImeAction.Search;
this.searchView.MaxWidth = int.MaxValue;
this.searchView.SetBackgroundResource(Resource.Drawable.textfield_search_holo_light);
}
}
}
/// <summary>
/// Reaction on the text change event of the searchbar.
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event argument.</param>
private void OnQueryTextChangeSearchView(object sender, SearchView.QueryTextChangeEventArgs e)
{
var searchPage = this.Element as SearchPage;
searchPage?.SearchCommand?.Execute(e?.NewText);
}
}
感谢this Stack-Overflow Thread,到目前为止,我让它像魅力一样工作。 现在,如果用户点击“SearchPage”中的某个项目,则使用以下方法将一个新的 ContentPage(称为“DetailPage”)推送到 NavigationStack:
private async Task PushPageAsync(object model, ContentPage page, INavigation navigation)
{
page.BindingContext = model;
await navigation.PushAsync(page).ConfigureAwait(false);
}
这没有问题。但是如果用户使用 Back-Button 从“DetailPage”导航回“SearchPage”,自定义的 Search-Header 根本不会显示。
我尝试了什么:
使用页面的“OnAppearing”事件而不是“OnElementChanged”。乍一看,这并没有解决问题。但是,如果我将 Task.Delay(500) 添加到 OnAppearing-Method,然后 再次 添加 SearchView,则会显示它。但是这个修复看起来很丑陋,如果我在使用 SearchPage 时休眠应用程序并恢复,Search-Widget 会显示 两次。
所以我的问题是:
Xamarin 中有错误还是我做错了什么?
【问题讨论】:
-
尝试覆盖
OnRestart。我最近发现了一个实例,当视图被带回前面时,需要重新绑定我的列表,这是一直被调用的方法 -
你最终选择了什么解决方案?
标签: c# xamarin xamarin.android xamarin.forms searchview