在 Prism 导航页面的工具栏中添加搜索栏

Posted

技术标签:

【中文标题】在 Prism 导航页面的工具栏中添加搜索栏【英文标题】:Adding a Search Bar in the toolbar of a navigationpage in Prism 【发布时间】:2018-04-16 05:16:23 【问题描述】:

我正在使用 Xamarin 表单(androidios),我正在努力在汉堡图标旁边直接添加一个搜索栏。对于导航,我使用的是 MasterDetail 页面。

<MasterDetailPage.Master>
        <!-- title on navigationpage is required -->
        <NavigationPage Title=" " Icon="hamburger_icon.png">
            <x:Arguments>
                <ContentPage Icon="hamburger_icon.png">
                    <StackLayout>

                        <controls:MenuButton Text="Home"
                                                 Command="Binding NavigateCommand" 
                                                 CommandParameter="Navigation/Dashboard">
                        </controls:MenuButton>

                        <controls:MenuButton Text="Test"
                                                 Command="Binding NavigateCommand" 
                                                 CommandParameter="Navigation/Dashboard">
                        </controls:MenuButton>

                    </StackLayout>
                </ContentPage>
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Master>

所以这个 NavigationPage 上方的某个地方应该是一个 SearchBar:

<SearchBar Grid.Row="0" Grid.Column="0" Margin="15" x:Name="search"></SearchBar>

【问题讨论】:

【参考方案1】:

由于XF的版本问题,OnCreateOptionsMenuOnCreateOptionsMenu可能找不到Toolbar,如果是这样,你可以在那个博客中更改SearchPageRenderer的代码,例如这样:

public class SearchPageRenderer : PageRenderer

    private Android.Support.V7.Widget.SearchView searchView;
    private Android.Support.V7.Widget.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()
    
        var mainactivity = Xamarin.Forms.Forms.Context as MainActivity;
        this.toolbar = mainactivity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
        var bar = mainactivity.SupportActionBar;
        if (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<Android.Support.V7.Widget.SearchView>();

            if (this.searchView != null)
            
                this.searchView.QueryTextChange += this.OnQueryTextChangeSearchView;
                //Other codes goes here.
            
        
    

    private void OnQueryTextChangeSearchView(object sender, Android.Support.V7.Widget.SearchView.QueryTextChangeEventArgs e)
    
        //TODO:
    

现在您可以将这个SearchPageRenderer 用于MasterDetailPageDetail

<local:SearchPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YOURNAMESPACE"
             x:Class="YOURNAMESPACE.DetailPage"
             Title="Detail 1">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Welcome to Xamarin.Forms!"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</local:SearchPage>

您可以在这里查看结果:

顺便说一句,我说的是纯 XF 中的解决方案,似乎您正在使用 Prism,不太确定 ContentPage 在 Prism 中是什么样的,但我认为解决方案应该是相似的。

【讨论】:

以上是关于在 Prism 导航页面的工具栏中添加搜索栏的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Master Detail prism 导航栏后退按钮

向导航栏添加半透明工具栏会导致 iOS 7 中出现渲染问题

SwiftUI 搜索栏与导航栏一致

jQuery Mobile 工具栏

jQuery Mobile 工具栏

如何添加视图,使其位于导航工具栏和标签栏之间