最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為Xamarin.Forms的導(dǎo)航欄增加搜索功能

 更新時(shí)間:2022年01月29日 09:15:43   作者:痕跡g  
這篇文章介紹了為Xamarin.Forms的導(dǎo)航欄增加搜索功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在使用NavigationPage導(dǎo)航的時(shí)候, 我們可以給里面添加一些功能按鈕, 如下所示:

    <ContentPage.ToolbarItems>
        <ToolbarItem/>
        <ToolbarItem/>
    </ContentPage.ToolbarItems>

但是如果需要給這個(gè)控件添加一些其他的控件的時(shí)候, 則無法滿足我們的需求, 這個(gè)時(shí)候, 我們就需要使用 頁(yè)面渲染器(Page Renderer)。

真機(jī)效果演示:

實(shí)現(xiàn)思路:

  • 1.添加用于搜索通知的接口 : ISearchPage
  • 2.自定義搜索的渲染器 : SearchPageRender
  • 3.添加Menu/Item Xml文件: mainmenu.xml
  • 4.添加 Nuget:Plugin.CurrentActivity
  • 5.給需要添加搜索功能的頁(yè)面實(shí)現(xiàn) (1)的接口
  • 6.為自定義搜索渲染器添加支持該功能的頁(yè)面
  • 7.啟動(dòng)項(xiàng)初始化 : CrossCurrentActivity.Current.Init(this, savedInstanceState)

添加搜索通知接口

    public interface ISearchPage
    {
        void OnSearchBarTextChanged(string text);
    }

自定義渲染器

在Android項(xiàng)目中創(chuàng)建 CustomRender文件夾定義 SearchPageRender

SearchPageRender代碼

     public class SearchPageRender : PageRenderer
    {
        public SearchPageRender(Context context) : base(context)
        {

        }

        protected override void OnAttachedToWindow()
        {
            base.OnAttachedToWindow();

            if (Element is ISearchPage
                && Element is Page page
                && page.Parent is NavigationPage navigationPage)
            {
                //Workaround to re-add the SearchView when navigating back to an ISearchPage, because Xamarin.Forms automatically removes it
                navigationPage.Popped += HandleNavigationPagePopped;
                navigationPage.PoppedToRoot += HandleNavigationPagePopped;
            }
        }

        //Adding the SearchBar in OnSizeChanged ensures the SearchBar is re-added after the device is rotated, because Xamarin.Forms automatically removes it
        protected override void OnSizeChanged(int w, int h, int oldw, int oldh)
        {
            base.OnSizeChanged(w, h, oldw, oldh);

            if (Element is ISearchPage && Element is Page page && page.Parent is NavigationPage navigationPage && navigationPage.CurrentPage is ISearchPage)
            {
                AddSearchToToolbar(page.Title);
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (GetToolbar() is Android.Support.V7.Widget.Toolbar toolBar)
                toolBar.Menu?.RemoveItem(Resource.Menu.mainmenu);

            base.Dispose(disposing);
        }

        //Workaround to re-add the SearchView when navigating back to an ISearchPage, because Xamarin.Forms automatically removes it
        void HandleNavigationPagePopped(object sender, NavigationEventArgs e)
        {
            if (sender is NavigationPage navigationPage
                && navigationPage.CurrentPage is ISearchPage)
            {
                AddSearchToToolbar(navigationPage.CurrentPage.Title);
            }
        }

        void AddSearchToToolbar(string pageTitle)
        {
            if (GetToolbar() is Android.Support.V7.Widget.Toolbar toolBar
            && toolBar.Menu?.FindItem(Resource.Id.action_search)?.ActionView?.
            JavaCast<Android.Support.V7.Widget.SearchView>().GetType()
            != typeof(Android.Support.V7.Widget.SearchView))
            {
                toolBar.Title = pageTitle;
                toolBar.InflateMenu(Resource.Menu.mainmenu);

                if (toolBar.Menu?.FindItem(Resource.Id.action_search)?.ActionView?.
                    JavaCast<Android.Support.V7.Widget.SearchView>() is
                     Android.Support.V7.Widget.SearchView searchView)
                {
                    searchView.QueryTextChange += SearchView_QueryTextChange;
                    searchView.ImeOptions = (int)ImeAction.Search;
                    searchView.InputType = (int)InputTypes.TextVariationFilter;
                    searchView.MaxWidth = int.MaxValue;
                }
            }
        }

        private void SearchView_QueryTextChange(object sender, Android.Support.V7.Widget.SearchView.QueryTextChangeEventArgs e)
        {
            if (Element is ISearchPage searchPage)
                searchPage.OnSearchBarTextChanged(e.NewText);
        }

        private static Android.Support.V7.Widget.Toolbar GetToolbar() => (CrossCurrentActivity.Current?.Activity as MainActivity)?.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
    }

添加Xml文件引用SearchView

創(chuàng)建mainmenu.xml

在Android的Resources文件夾中, 創(chuàng)建menu文件夾創(chuàng)建mainmenu.xml文件, 如下:

mainmenu.xml

    <?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
	<item android:id="@+id/action_search"
		  android:title="Search"
		  android:icon="@android:drawable/ic_menu_search"
		  app:showAsAction="always|collapseActionView"
		  app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

添加NuGet:Plugin.CurrentActivity

在Android項(xiàng)目中, 添加NuGet包: Plugin.CurrentActivity , 并且在SearchPageRender 中引用它。

頁(yè)面實(shí)現(xiàn)接口 ISearchPage

渲染器添加實(shí)現(xiàn)頁(yè)

如下圖所示, 第一個(gè)typeof 指向的就是實(shí)現(xiàn)搜索內(nèi)容頁(yè)的Page

MainActivity初始化

在MainActivity的 OnCreate 中, 添加初始化的代碼, 如下:

以上步驟完整之后, 通過導(dǎo)航頁(yè)打開的頁(yè)面即可自帶搜索功能。

到此這篇關(guān)于為Xamarin.Forms的導(dǎo)航欄增加搜索功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# Struct的內(nèi)存布局問題解答

    C# Struct的內(nèi)存布局問題解答

    這篇文章介紹了C# Struct的內(nèi)存布局問題解答,有需要的朋友可以參考一下
    2013-11-11
  • WPF自定義路由事件的實(shí)例教程

    WPF自定義路由事件的實(shí)例教程

    &#65279;WPF中有兩種事件模型,一種是在WinForm時(shí)代就存在的CLR事件,另一種是WPF時(shí)代的路由事件,這篇文章主要給大家介紹了關(guān)于WPF自定義路由事件的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C#編程實(shí)現(xiàn)自定義熱鍵的方法

    C#編程實(shí)現(xiàn)自定義熱鍵的方法

    這篇文章主要介紹了C#編程實(shí)現(xiàn)自定義熱鍵的方法,涉及C#鍵盤按鍵設(shè)置的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#詞法分析器之構(gòu)造NFA詳解

    C#詞法分析器之構(gòu)造NFA詳解

    本篇文章介紹了,C#詞法分析器之構(gòu)造NFA詳解。需要的朋友參考下
    2013-05-05
  • C# XML基礎(chǔ)入門小結(jié)(XML文件內(nèi)容增刪改查清)

    C# XML基礎(chǔ)入門小結(jié)(XML文件內(nèi)容增刪改查清)

    本文主要介紹了C# XML基礎(chǔ)入門小結(jié)(XML文件內(nèi)容增刪改查清),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#在復(fù)雜多線程環(huán)境下使用讀寫鎖同步寫入文件

    C#在復(fù)雜多線程環(huán)境下使用讀寫鎖同步寫入文件

    這篇文章介紹了C#在復(fù)雜多線程環(huán)境下使用讀寫鎖同步寫入文件的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#簡(jiǎn)單生成縮略圖的方法

    C#簡(jiǎn)單生成縮略圖的方法

    這篇文章主要介紹了C#簡(jiǎn)單生成縮略圖的方法,涉及C#操作圖片的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • c#如何獲取json數(shù)組里指定參數(shù)

    c#如何獲取json數(shù)組里指定參數(shù)

    這篇文章主要介紹了c#如何獲取json數(shù)組里指定參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Unity實(shí)現(xiàn)文本轉(zhuǎn)貼圖

    Unity實(shí)現(xiàn)文本轉(zhuǎn)貼圖

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)文本轉(zhuǎn)貼圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 基于C#實(shí)現(xiàn)壓縮和解壓文件及文件夾

    基于C#實(shí)現(xiàn)壓縮和解壓文件及文件夾

    這篇文章主要為大家詳細(xì)介紹了基于C#實(shí)現(xiàn)壓縮和解壓文件及文件夾的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評(píng)論

沅陵县| 荥经县| 中宁县| 平原县| 永城市| 兴和县| 连南| 安平县| 嵊州市| 台南县| 峨边| 茂名市| 莎车县| 独山县| 海晏县| 英德市| 榆中县| 翁牛特旗| 杂多县| 海林市| 台前县| 丰台区| 东港市| 延长县| 邹平县| 漠河县| 都安| 雷州市| 绵阳市| 土默特右旗| 万宁市| 上林县| 榆树市| 双流县| 鱼台县| 云梦县| 广州市| 扶绥县| 吴江市| 浦江县| 巴青县|