zoukankan      html  css  js  c++  java
  • 44、Search contract

     SearchPane 类 和它的成员:

    namespace Windows.ApplicationModel.Search
    {
        // 表示和管理用户激活“搜索”个性分类时打开的搜索窗格。
        public sealed class SearchPane
        {
    
           // 标识当前与用户的文本输入设备关联的语言的 Internet 工程任务组 (IETF) 语言标记 (BCP 47 标准)。
            // 返回结果: IETF BCP 47 标准语言标记。
            public string Language { get; }
    
           //  当搜索框没有输入焦点且用户未输入任意字符时的搜索框中的占位符文本。
            // 返回结果:  在搜索框中显示的占位符文本。
            public string PlaceholderText { get; set; }
          
           // 搜索窗格的搜索框中的当前文本。
            // 返回结果:  当前查询文本。 如果未使用搜索窗格,则这是一个空字符串。
            public string QueryText { get; }
           
           //  标识搜索上下文和用于存储用户搜索应用程序历史记录的字符串。
            // 返回结果:  搜索历史记录上下文字符串。
            public string SearchHistoryContext { get; set; }
            
           //  指示是否自动跟踪应用程序的前一个用户搜索以及该搜索是否用于提供建议。
            // 返回结果: 如果用户的搜索历史记录将被自动跟踪并用于提供建议,则为 true;否则为 false。默认值为 true。
            public bool SearchHistoryEnabled { get; set; }
            public bool ShowOnKeyboardInput { get; set; }
          
           // 指示搜索窗格是否打开。
            // 返回结果:  如果正在显示搜索窗格,则为 true;否则为 false。
            public bool Visible { get; }
    
           // 当用户在搜索框中更改文本时激发。
            public event TypedEventHandler<SearchPane, SearchPaneQueryChangedEventArgs> QueryChanged;
                 
           // 当用户在搜索框中提交文本,且应用程序需要显示搜索结果时激发。
            public event TypedEventHandler<SearchPane, SearchPaneQuerySubmittedEventArgs> QuerySubmitted;
           
           // 当用户选择由您的应用程序提供,且显示在搜索窗格中的其中一个建议结果时激发。
            public event TypedEventHandler<SearchPane, SearchPaneResultSuggestionChosenEventArgs> ResultSuggestionChosen;
           
           // 当用户的查询文本发生更改,且应用程序需要提供新的建议以显示在搜索窗格中时激发。
    public event TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs> SuggestionsRequested; //当用户打开或关闭搜索窗格时激发。 public event TypedEventHandler<SearchPane, SearchPaneVisibilityChangedEventArgs> VisibilityChanged; // 检索可用于在该应用程序内进行搜索的搜索窗格实例。 // 返回结果: 搜索窗格的实例,为当前应用程序中的搜索提供一致、触控友好的搜索框和选项搜索建议。 public static SearchPane GetForCurrentView(); // 指定基于本地文件的建议是否自动显示在搜索窗格,并定义 Windows 使用的条件来定位和筛选这些建议。 // settings: 本地内容建议的新设置。 public void SetLocalContentSuggestionSettings(LocalContentSuggestionSettings settings); // 显示搜索窗格。 public void Show(); // 显示具有指定的初始查询字符串的搜索窗格。 // query: 初始查询字符串。 public void Show(string query); public bool TrySetQueryText(string query); } }

    1、Using the Search contract:   

          加入 搜索合约,可以让用户在操作系统的任何地方都可以选择你的应用进行搜索操作。

          按照下面的步骤可以知道怎样让用户选择一个 app (使用合约) 来从 Search charm 进行搜索:

      1) 选择搜索框

      2) 输入搜索词

      3) 提交搜索

      4) 在搜索面板上选择不同的应用

      5)  提交新的搜索词

      6) 切换到当前实例

    操作截图:

        1) 首先选择 "超级按钮" 中的 搜索按钮, 然后输入搜索词:

      2) 选择下面列表中的 "Search contract C#  sample" , 在 MainPage 中的 TextBlock 中输出结果:

    在 App.xaml.cs  文件中添加相应的代码 :

       当应用是被 "搜索" 合约激活时, 只需要重写 OnSearchActivated(SearchActivatedEventArgs args) 方法:

     async protected override void OnSearchActivated(SearchActivatedEventArgs args)
     {
         await EnsureMainPageActivatedAsync(args);
         if (args.QueryText == "")
         {
             // navigate to landing page.
         }
         else
         {
             // 显示搜索结果, 下面的方法只是把搜索关键字赋值给 
              //MainPage 中的一个 TextBlock 对象
              MainPage.Current.ProcessQueryText(args.QueryText);
         }
     }
    
    
    //确保 MainPage 已经初始化完毕
    async private Task EnsureMainPageActivatedAsync(IActivatedEventArgs args)
    {
        if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
        {
            // Do an asynchronous restore
            await SuspensionManager.RestoreAsync();
    
        }
    
        if (Window.Current.Content == null)
        {
            var rootFrame = new Frame();
            rootFrame.Navigate(typeof(MainPage));
            Window.Current.Content = rootFrame;
        }
    
        Window.Current.Activate();
    }
    
    async protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
    await EnsureMainPageActivatedAsync(args);
    }

         为了让应用程序在运行的整个生命周期都能接收用户的搜索请求, 在 App.xaml.cs 文件中, 重写 OnWindowCreated() 方法,

     然后注册搜索触发事件:

      protected override void OnWindowCreated(WindowCreatedEventArgs args)
            {
                 //GetForCurrentView() :  检索可用于在该应用程序内进行搜索的搜索窗格实例。
                 //当用户在搜索框中提交文本,且应用程序需要显示搜索结果时激发。
                   SearchPane.GetForCurrentView().QuerySubmitted += new TypedEventHandler<SearchPane, SearchPaneQuerySubmittedEventArgs>(OnQuerySubmitted);
                            
            }
      private void OnQuerySubmitted(object sender, SearchPaneQuerySubmittedEventArgs args)
      {
    
          if (MainPage.Current != null)
          {
              MainPage.Current.ProcessQueryText(args.QueryText);
          }
      }

    2、Suggestions from an app-defined list :

          在你的应用程序中, 提供一个用来 "建议搜索文本" 的本地列表,  按照下面的步骤操作:

        1) 选择 Search 对话框

        2) 输入一个城市的名称,  比如 : San Bernardino :

        3)  搜索结果就显示出来了。

         在  C# 页面, 获取当前视图,  并且定义一个供搜索使用的字符串数组:

     private SearchPane searchPane= SearchPane.GetForCurrentView();
    
     private static readonly string[] suggestionList =
         {
             "Shanghai", "Istanbul", "Karachi", "Delhi", "Mumbai", "Moscow", "S鉶 Paulo", "Seoul", "Beijing", "Jakarta",
             "Tokyo", "Mexico City", "Kinshasa", "New York City", "Lagos", "London", "Lima", "Bogota", "Tehran", "Ho Chi Minh City",
             "Hong Kong", "Bangkok", "Dhaka", "Cairo", "Hanoi", "Rio de Janeiro", "Lahore", "Chonquing", "Bengaluru", "Tianjin",
             "Baghdad", "Riyadh", "Singapore", "Santiago", "Saint Petersburg", "Surat", "Chennai", "Kolkata", "Yangon", "Guangzhou",
             "Alexandria", "Shenyang", "Hyderabad", "Ahmedabad", "Ankara", "Johannesburg", "Wuhan", "Los Angeles", "Yokohama",
             "Abidjan", "Busan", "Cape Town", "Durban", "Pune", "Jeddah", "Berlin", "Pyongyang", "Kanpur", "Madrid", "Jaipur",
             "Nairobi", "Chicago", "Houston", "Philadelphia", "Phoenix", "San Antonio", "San Diego", "Dallas", "San Jose",
             "Jacksonville", "Indianapolis", "San Francisco", "Austin", "Columbus", "Fort Worth", "Charlotte", "Detroit",
             "El Paso", "Memphis", "Baltimore", "Boston", "Seattle Washington", "Nashville", "Denver", "Louisville", "Milwaukee",
             "Portland", "Las Vegas", "Oklahoma City", "Albuquerque", "Tucson", "Fresno", "Sacramento", "Long Beach", "Kansas City",
             "Mesa", "Virginia Beach", "Atlanta", "Colorado Springs", "Omaha", "Raleigh", "Miami", "Cleveland", "Tulsa", "Oakland",
             "Minneapolis", "Wichita", "Arlington", " Bakersfield", "New Orleans", "Honolulu", "Anaheim", "Tampa", "Aurora",
             "Santa Ana", "St. Louis", "Pittsburgh", "Corpus Christi", "Riverside", "Cincinnati", "Lexington", "Anchorage",
             "Stockton", "Toledo", "St. Paul", "Newark", "Greensboro", "Buffalo", "Plano", "Lincoln", "Henderson", "Fort Wayne",
             "Jersey City", "St. Petersburg", "Chula Vista", "Norfolk", "Orlando", "Chandler", "Laredo", "Madison", "Winston-Salem",
             "Lubbock", "Baton Rouge", "Durham", "Garland", "Glendale", "Reno", "Hialeah", "Chesapeake", "Scottsdale",
             "North Las Vegas", "Irving", "Fremont", "Irvine", "Birmingham", "Rochester", "San Bernardino", "Spokane",
             "Toronto", "Montreal", "Vancouver", "Ottawa-Gatineau", "Calgary", "Edmonton", "Quebec City", "Winnipeg", "Hamilton"
         };

    当导航到当前页面时, 注册 "搜索请求" 事件 :

      
    
           //导航到时,注册
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
    
              //这个事件应该注册在你的应用主窗口的第一次初始化完成后,比如
              // OnLaunched,  OnSearcheActivated 事件中,
              // 例如在 App.xaml.cs  中的事件
                searchPane.SuggestionsRequested += new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); }
    //导航走时,取消注册 protected override void OnNavigatedFrom(NavigationEventArgs e) { searchPane.SuggestionsRequested -= new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); }

    当 "搜索建议请求"  触发时,  即 "搜索" 文本框中的文本值变化时 (不是按下搜索按钮):

            private void OnSearchPaneSuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs e)
            {
    
                //当 suggestionsrequested 事件激发时应用程序应为其提供建议对在搜索框中的文本。
                  var queryText = e.QueryText;
                if (!string.IsNullOrEmpty(queryText))
                {
                    var request = e.Request;
                    foreach (string suggestion in suggestionList)
                    {
    
                      //CurrentCultureIgnoreCase :  使用区域敏感排序规则、当前区域
                      //来比较字符串,同时忽略被比较字符串的大小写。
                         if (suggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
                        {
                            // 将查询建议追加到搜索窗格的搜索建议列表中。
                               request.SearchSuggestionCollection.AppendQuerySuggestion(suggestion);
    
                            // 最多向 "搜索面板" 中添加 5 条建议
                               if (request.SearchSuggestionCollection.Size >= 5)
                            {
                                break;
                            }
                        }
                    }
    
                    if (request.SearchSuggestionCollection.Size > 0)
                    {
                        //Suggestions provided for query: " + queryText
                    }
                    else
                    {
                       // No suggestions provided for query: queryText
                    }
                }
            }

    当按下 "搜索面板" 上面的 搜索按钮时, 触发 App.xaml.cs 文件中 注册的 QuerySubmitted 事件。

    3、Suggestions in East Asian languages :

         为东亚的语言 ( 主要是中国和日本) 的语言选择语言的查询项。其他的替代方案是针对一组静态匹配的建议。

         注意: 本实例中的日语输入法必须可用, 以使功能正常。

         尝试下面的步骤:

        1) 选择搜索面板

        2) 使用日语输入法输入 类似 "横浜市" 的搜索词

        3) 搜索建议列表就会提供建议

    相应的 C# 代码:

    获取可用于在该应用程序内进行搜索的搜索窗格实例:

    private SearchPane searchPane = SearchPane.GetForCurrentView();

    声明搜索建议列表:

    View Code
     private static readonly string[] suggestionList =
                {
                    "特別区部", "横浜市", "大阪市", "名古屋市", "札幌市", "神戸市", "京都市", "福岡市", "川崎市", "さいたま市",
                    "広島市", "仙台市", "北九州市", "千葉市", "世田谷区", "堺市", "新潟市", "浜松市", "熊本市", "相模原市", "練馬区", "静岡市", "岡山市",
                    "大田区", "足立区", "江戸川区", "船橋市", "鹿児島市", "八王子市", "杉並区", "姫路市", "板橋区", "松山市", "宇都宮市", "東大阪市",
                    "川口市", "松戸市", "西宮市", "倉敷市", "市川市", "大分市", "金沢市", "福山市", "江東区", "尼崎市", "長崎市", "葛飾区", "町田市",
                    "富山市", "豊田市", "高松市", "横須賀市", "岐阜市", "藤沢市", "枚方市", "柏市", "宮崎市", "豊中市", "長野市", "豊橋市", "一宮市",
                    "岡崎市", "高崎市", "和歌山市", "奈良市", "品川区", "高槻市", "吹田市", "旭川市", "高知市", "川越市", "いわき市", "所沢市", "前橋市",
                    "郡山市", "大津市", "北区", "越谷市", "新宿区", "秋田市", "那覇市", "中野区", "四日市市", "春日井市", "久留米市", "青森市", "盛岡市",
                    "福島市", "明石市", "津市", "豊島区", "長岡市", "下関市", "市原市", "函館市", "茨木市", "水戸市", "目黒区", "八尾市", "加古川市", "福井市",
                    "徳島市", "佐世保市", "平塚市", "府中市", "山形市", "富士市", "墨田区", "草加市", "松本市", "呉市", "寝屋川市", "佐賀市", "八戸市", "春日部市",
                    "茅ヶ崎市", "大和市", "宝塚市", "厚木市", "上尾市", "調布市", "太田市", "つくば市", "伊勢崎市", "文京区", "港区", "渋谷区", "荒川区", "上越市",
                    "熊谷市", "沼津市", "鈴鹿市", "岸和田市", "甲府市", "小田原市", "鳥取市", "山口市", "西東京市", "伊丹市", "松江市", "日立市", "東広島市", "八千代市",
                    "宇治市", "小平市", "三鷹市", "和泉市", "弘前市", "豊川市", "釧路市", "立川市", "日野市", "安城市", "高岡市", "台東区", "鎌倉市", "宇部市", "苫小牧市",
                    "佐倉市", "秦野市", "都城市", "磐田市", "松阪市", "帯広市", "今治市", "西尾市", "浦安市", "小山市", "習志野市", "流山市", "大垣市", "石巻市", "上田市",
                    "新座市", "ひたちなか市", "川西市", "狭山市", "野田市", "足利市", "久喜市", "東村山市", "入間市", "周南市", "米子市", "多摩市", "小牧市", "守口市",
                    "刈谷市", "各務原市", "尾道市", "深谷市", "岩国市", "出雲市", "焼津市", "土浦市", "古河市", "藤枝市", "諫早市", "桑名市", "栃木市", "青梅市",
                    "武蔵野市", "鶴岡市", "稲沢市", "大崎市", "我孫子市", "八代市", "瀬戸市", "富士宮市", "小樽市", "飯塚市", "三郷市", "延岡市", "草津市", "門真市",
                    "伊勢市", "沖縄市", "箕面市", "朝霞市", "木更津市", "座間市", "成田市", "海老名市", "霧島市", "大東市", "唐津市", "会津若松市", "北見市", "橿原市",
                    "別府市", "奥州市", "松原市", "長浜市", "江別市", "大牟田市", "戸田市", "中央区", "新居浜市", "桐生市", "佐野市", "国分寺市", "鴻巣市", "富田林市",
                    "小金井市", "半田市", "一関市", "生駒市", "那須塩原市", "羽曳野市", "うるま市", "防府市", "東久留米市", "掛川市", "東近江市", "加須市", "三田市",
                    "廿日市市", "多治見市", "河内長野市", "昭島市", "西条市", "彦根市", "三島市", "酒田市", "白山市", "丸亀市", "浦添市", "取手市", "筑西市", "小松市",
                    "鎌ケ谷市", "東海市", "春日市", "富士見市", "津山市", "ふじみ野市", "飯田市", "鹿屋市", "池田市", "鹿沼市", "三条市", "坂戸市", "花巻市", "新発田市",
                    "伊勢原市", "泉佐野市", "佐久市", "三原市", "島田市", "筑紫野市", "江南市", "薩摩川内市", "糸島市", "横手市", "可児市", "伊賀市", "安曇野市", "宗像市",
                    "大野城市", "神栖市", "室蘭市", "高砂市", "千歳市", "射水市", "芦屋市", "北上市", "茂原市", "高山市", "甲賀市", "亀岡市", "坂井市", "宜野湾市", "柏崎市",
                    "関市", "貝塚市", "大村市", "岩見沢市", "東松山市", "日光市", "四国中央市", "米沢市", "君津市", "天草市", "御殿場市", "大和郡山市", "舞鶴市", "大仙市",
                    "印西市", "四街道市", "あま市", "行田市", "越前市", "豊岡市", "大府市", "由利本荘市", "袋井市", "稲城市", "知多市", "中津市", "宇和島市", "日進市",
                    "登米市", "摂津市", "飯能市", "渋川市", "綾瀬市", "東大和市", "八潮市", "香取市", "真岡市", "蒲郡市", "本庄市", "燕市", "近江八幡市", "牛久市",
                    "北名古屋市", "尾張旭市", "三木市", "中津川市", "あきる野市", "和光市", "たつの市", "龍ケ崎市", "名張市", "城陽市", "長岡京市", "石岡市", "福知山市",
                    "笠間市", "須賀川市", "田辺市", "大館市", "狛江市", "館林市", "交野市", "大田原市", "泉大津市", "佐伯市", "守山市", "阿南市", "国立市", "香芝市",
                    "犬山市", "栗原市", "柏原市", "姶良市", "桶川市", "八幡市", "清瀬市", "甲斐市", "気仙沼市", "八街市", "名取市", "南アルプス市", "碧南市", "加賀市",
                    "蕨市", "伊東市", "柳川市", "伊那市", "日田市", "南相馬市", "笛吹市", "太宰府市", "行橋市", "銚子市", "武蔵村山市", "鶴ヶ島市", "木津川市", "豊明市",
                    "志木市", "玉名市", "恵庭市", "天理市", "旭市", "鳥栖市", "八女市", "北本市", "三豊市", "大和高田市", "知立市", "藤岡市", "京田辺市", "丹波市", "敦賀市",
                    "塩尻市", "鯖江市", "羽島市", "秩父市", "村上市", "橋本市", "総社市", "藤井寺市", "十和田市", "伊達市", "鹿嶋市", "清須市", "紀の川市", "常総市",
                    "吉川市", "津島市", "愛西市", "白河市", "山陽小野田市", "玉野市", "泉南市", "田原市", "栗東市", "蓮田市", "日向市", "多賀城市", "佐渡市", "観音寺市",
                    "守谷市", "天童市", "千曲市", "宇城市", "東金市", "浜田市", "南魚沼市", "鳴門市", "むつ市", "安中市", "鳩ヶ谷市", "土岐市", "北広島市", "袖ケ浦市",
                    "白井市", "名護市", "桜井市", "みよし市", "湖西市", "二本松市", "福生市", "高石市", "下野市", "石狩市", "宮古市", "能代市", "京丹後市", "宇佐市",
                    "十日町市", "小郡市", "五所川原市", "逗子市", "大阪狭山市", "古賀市", "七尾市", "日南市", "直方市", "四條畷市", "日高市", "糸満市", "豊見城市",
                    "伊万里市", "羽村市", "阪南市", "三次市", "塩竈市", "茅野市", "朝倉市", "常陸太田市", "羽生市", "坂東市", "山武市", "坂出市", "出水市", "福津市",
                    "山鹿市", "荒尾市", "下松市", "合志市", "常滑市", "海南市", "美濃加茂市", "南砺市", "志摩市", "湖南市", "五泉市", "裾野市", "向日市", "笠岡市",
                    "那珂市", "幸手市", "萩市", "恵那市", "さぬき市", "光市", "岩出市", "岡谷市", "結城市", "高島市", "喜多方市", "小美玉市", "須坂市", "富岡市", "宮古島市",
                    "瑞穂市", "みどり市", "氷見市", "登別市", "沼田市", "諏訪市", "富里市", "亀山市", "湯沢市", "日置市", "倉吉市", "武雄市", "富士吉田市", "田川市",
                    "赤穂市", "南島原市", "菊池市", "鉾田市", "益田市", "野洲市", "新城市", "南あわじ市", "小野市", "南国市", "砺波市", "館山市", "伊豆の国市", "牧之原市",
                    "真庭市", "能美市", "筑後市", "三浦市", "小林市", "富津市", "加西市", "北斗市", "糸魚川市", "島原市", "岩倉市", "洲本市", "雲仙市", "大洲市", "千代田区",
                    "菊川市", "北茨城市", "石垣市", "稲敷市", "北杜市", "淡路市", "東根市", "奄美市", "桜川市", "いなべ市", "中野市", "阿賀野市", "常陸大宮市", "小城市",
                    "下妻市", "魚津市", "さくら市", "郡上市", "つくばみらい市", "指宿市", "中間市", "岩沼市", "吉野川市", "小諸市", "高浜市", "井原市", "南足柄市",
                    "かすみがうら市", "赤磐市", "弥富市", "篠山市", "滝川市", "東松島市", "西脇市", "嘉麻市", "府中市", "寒河江市", "南房総市", "西予市", "雲南市",
                    "見附市", "黒部市", "安来市", "臼杵市", "三沢市", "網走市", "いすみ市", "宍粟市", "大船渡市", "みやま市", "小松島市", "五島市", "田村市", "瑞浪市",
                    "魚沼市", "庄原市", "加東市", "米原市", "匝瑳市", "南城市", "稚内市", "熱海市", "釜石市", "豊後大野市", "阿波市", "曽於市", "南九州市", "新庄市",
                    "南さつま市", "小千谷市", "八幡浜市", "長門市", "大田市", "伊予市", "海津市", "瀬戸内市", "備前市", "相馬市", "宇土市", "行方市", "大川市", "白石市",
                    "つがる市", "久慈市", "山梨市", "北秋田市", "下呂市", "伊達市", "黒石市", "浅口市", "四万十市", "葛城市", "綾部市", "鴨川市", "人吉市", "妙高市",
                    "矢板市", "大野市", "東温市", "南丹市", "境港市", "本巣市", "高梁市", "平戸市", "柳井市", "由布市", "御前崎市", "かほく市", "鹿角市", "五條市",
                    "潟上市", "対馬市", "宇陀市", "伊豆市", "甲州市", "新見市", "上山市", "香南市", "善通寺市", "平川市", "駒ヶ根市", "滑川市", "南陽市", "東かがわ市",
                    "都留市", "志布志市", "神埼市", "朝来市", "西都市", "美馬市", "韮崎市", "男鹿市", "杵築市", "小矢部市", "国東市", "うきは市", "本宮市", "安芸高田市",
                    "新宮市", "胎内市", "小浜市", "角田市", "中央市", "西海市", "相生市", "いちき串木野市", "高萩市", "鹿島市", "東御市", "有田市", "名寄市", "潮来市",
                    "美作市", "御所市", "宮若市", "あわら市", "三好市", "上天草市", "輪島市", "大町市", "加茂市", "二戸市", "山県市", "仙北市", "長井市", "壱岐市", "遠野市",
                    "伊佐市", "根室市", "那須烏山市", "嬉野市", "大竹市", "香美市", "土佐市", "八幡平市", "竹原市", "美祢市", "阿蘇市", "大月市", "にかほ市", "上野原市",
                    "豊前市", "江田島市", "水俣市", "村山市", "飛騨市", "養父市", "御坊市", "美唄市", "江津市", "勝山市", "松浦市", "下田市", "紋別市", "須崎市", "留萌市",
                    "竹田市", "富良野市", "豊後高田市", "深川市", "枕崎市", "飯山市", "陸前高田市", "阿久根市", "羽咋市", "美濃市", "宿毛市", "士別市", "えびの市", "鳥羽市",
                    "多久市", "勝浦市", "串間市", "尾鷲市", "宮津市", "津久見市", "熊野市", "安芸市", "砂川市", "尾花沢市", "垂水市", "西之表市", "芦別市", "珠洲市",
                    "土佐清水市", "室戸市", "赤平市", "夕張市", "三笠市", "歌志内市"
                };

    绑定和解绑定 "搜索建议" 事件:

      protected override void OnNavigatedTo(NavigationEventArgs e)
            {
               searchPane.SuggestionsRequested += new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); }
    protected override void OnNavigatedFrom(NavigationEventArgs e) { searchPane.SuggestionsRequested -= new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); }


    具体方法:

            private void OnSearchPaneSuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs e)
            {
                var queryText = e.QueryText;
                if (!string.IsNullOrEmpty(queryText))
                {
                    var request = e.Request;
    
                    // 提供有关查询文本的语言信息(用户通过输入法编辑器 (IME) 输入)的对象。
                      var linguisticDetails = e.LinguisticDetails;
                    foreach (string alternative in linguisticDetails.QueryTextAlternatives)
                    {
                        foreach (string suggestion in suggestionList)
                        {
                            if (suggestion.StartsWith(alternative, StringComparison.CurrentCultureIgnoreCase))
                            {
                                //  将查询建议追加到搜索窗格的搜索建议列表中。
                                    request.SearchSuggestionCollection.AppendQuerySuggestion(suggestion);
    
                                // 最多 5 条建议
    
                                if (request.SearchSuggestionCollection.Size >= 5)
                                {
                                    break;
                                }
                            }
                        }
    
                        if (request.SearchSuggestionCollection.Size >= MainPage.SearchPaneMaxSuggestions)
                        {
                            break;
                        }
                    }
    
                    if (request.SearchSuggestionCollection.Size > 0)
                    {
                        //Suggestions provided for query:  queryText
                    }
                    else
                    {
                      //No suggestions provided for query: queryText
                    }
                }
            }


    4、Suggestions from Open Search :

         使用 Windows 中的 库 或者文件夹中的内容来提供搜索的建议。这些建议都是基于文件的元数据。

         注意:确保你的 “音乐库”中有音乐文件。

          按照下面的步骤操作:

          1) 选择搜索面板

          2) 输入搜索词

          3) 搜索建议就显示出来了

     操作截图 , 当在搜索框中输入 "爱情转移" 时, 下面的建议列表就显示了音乐库中的 “爱情转移”这首歌:

    相应的 C# :

      //导航到页面时启用本地文件建议
      protected override void OnNavigatedTo(NavigationEventArgs e)
      {
          SetLocalContentSuggestions(true);
      }
    
      // 导航走时关闭
      protected override void OnNavigatedFrom(NavigationEventArgs e)
      {
          SetLocalContentSuggestions(false);
      }
      private void SetLocalContentSuggestions(bool isLocal)
      {
       
         //控制 Windows 提供本地文件的 建议列表
         //这段代码可以放到应用的全局区域,以使应用加载完成后就运行
         // 存储确定应用程序是否提供基于本地文件的建议的设置以及定义用于
         //定位和筛选这些建议的条件的设置。
          var settings = new LocalContentSuggestionSettings();
    
          //指示基于本地文件的建议是否在搜索窗格中显示。
          settings.Enabled = isLocal;
          if (isLocal)
          {
             // 包含用于提供建议的文件的 storageFolder 对象列表。
              settings.Locations.Add(KnownFolders.MusicLibrary);
    
             //高级查询语法 (AQS) 字符串,限制用于提供建议的文件类型。
              settings.AqsFilter = "kind:Music";
          }
    
         // 指定基于本地文件的建议是否自动显示在搜索窗格,并定义 
         //Windows 使用的条件来定位和筛选这些建议。
          SearchPane.GetForCurrentView().SetLocalContentSuggestionSettings(settings);
      }


    5、Suggestions from Open Search :

        这个例子展示了如何在搜索面板提供从web服务器返回的 使用 OpenSearch 格式的建议。

        1)  输入返回使用 OpenSearch Suggestions 格式数据 的 Web 服务器的 URL。

            在 URL 中使用 {searchTerms} 来代表你想插入的搜索文本

        2) 选择搜索面板

        3) 输入查询词

        4) 搜索建议就显示出来了

    相应的 XAML :

     
    <!--输入返回搜索建议的服务器的 URI-->
    <TextBox x:Name="UrlTextBox/>

    相应的 C# :

            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
               
               //可以再 App.xaml.cs 的 OnLaunched 或者 OnSearchActivated 事件中初始化
                searchPane.SuggestionsRequested += new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); }
    protected override void OnNavigatedFrom(NavigationEventArgs e) { searchPane.SuggestionsRequested -= new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); }


    初始化页面全局变量:

     private SearchPane searchPane = SearchPane.GetForCurrentView();
     private HttpClient httpClient = new HttpClient();
     private Task<string> currentHttpTask = null;

    定义页面析构函数 :

     ~Scenario5()
     {
         Dispose();
     }
    
     public void Dispose()
     {
         if (httpClient != null)
         {
             httpClient.Dispose();
             httpClient = null;
         }
     }

    触发 “搜索建议” 事件时调用:

            private async void OnSearchPaneSuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs e)
            {
                var queryText = e.QueryText;
                if (!string.IsNullOrEmpty(queryText) && !string.IsNullOrEmpty(UrlTextBox.Text)
                {
                    
                  // 存储有关请求的建议和信息的对象。
                    var request = e.Request;
    
                  // 检索允许应用程序异步响应建议请求的对象。
                    var deferral = request.GetDeferral();
    
                    try
                    {
    
                        //调用下面的方法
                           // 使用支持 OpenSearch Suggestions 格式的 URL
                        //来显示从 Web Service 返回的搜索建议
                           // 查看 OpenSearch Suggestions  格式的描述 : http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.0
                        //使用查询语句替换 URL 中的 "{searchTerms}" 
                        Task task = GetSuggestionsAsync(Regex.Replace(UrlTextBox.Text, "{searchTerms}", Uri.EscapeDataString(queryText)), 
    request.SearchSuggestionCollection);
    await task; // 如果已成功完成执行的任务。 if (task.Status == TaskStatus.RanToCompletion) { if (request.SearchSuggestionCollection.Size > 0) { // Suggestions provided for query: queryText } else { // No suggestions provided for query: queryText } } } catch (TaskCanceledException) { // 我们已经取消 task. } catch (FormatException) { // Suggestions could not be retrieved, please verify that the URL points to a valid service
    //(for example
    http://contoso.com?q={searchTerms}" } catch (Exception) { // Suggestions could not be displayed, please verify that the service provides valid OpenSearch suggestions } finally { //在处理 suggestionsrequested 事件时应用程序已完成填充 //searchSuggestionCollection 对象的信号。 deferral.Complete(); } } }

    向服务器端请求数据的任务:

     private async Task GetSuggestionsAsync(string str, SearchSuggestionCollection suggestions)
     {
         // Cancel the previous suggestion request if it is not finished.
         //如果没有完成就取消前面的 搜索建议的请求
         if (currentHttpTask != null)
         {
     
    // 返回表示返回结果的开始任务的 Windows 运行时异步操作。 // source: 已启动的任务。 // TResult: 返回结果的类型。 // 返回结果: 表示开始的任务的 Windows.Foundation.IAsyncOperation<TResult> 实例。 // public static IAsyncOperation<TResult> AsAsyncOperation<TResult>(this Task<TResult> source); currentHttpTask.AsAsyncOperation<string>().Cancel(); } // 从一个打开的搜索服务获取建议。 //将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。 currentHttpTask = httpClient.GetStringAsync(str); string response = await currentHttpTask; // 分析表示 JsonArray 的指定 JSON 字符串。 JsonArray parsedResponse = JsonArray.Parse(response); if (parsedResponse.Count > 1) { foreach (JsonValue value in parsedResponse[1].GetArray()) { suggestions.AppendQuerySuggestion(value.GetString()); if (suggestions.Size >= 5) { break; } } } }


    6、Suggestions from a service returning XML :

        这个实例演示怎样在搜索面板显示从一个 web service 返回的 xml 格式的搜索建议。

        1) 在文本框中输入 能返回 XML 格式搜索建议的 URL

        2) 键入搜索词

        3) 搜索结果显示

    页面的 xaml :

    WebService 的 URL:

      <TextBox x:Name="UrlTextBox" />

    定义页面全局变量:

    private SearchPane searchPane = SearchPane.GetForCurrentView();
    private IAsyncOperation<XmlDocument> currentXmlRequestOp = null;

    绑定、解绑定搜索事件:

            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
              
                searchPane.SuggestionsRequested += new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested);
    // 当用户选择由您的应用程序提供,且显示在搜索窗格中的其中一个建议结果时激发。 searchPane.ResultSuggestionChosen += new TypedEventHandler<SearchPane, SearchPaneResultSuggestionChosenEventArgs>(
    OnResultSuggestionChosen); }
    protected override void OnNavigatedFrom(NavigationEventArgs e) { searchPane.SuggestionsRequested -= new TypedEventHandler<SearchPane, SearchPaneSuggestionsRequestedEventArgs>(
    OnSearchPaneSuggestionsRequested); searchPane.ResultSuggestionChosen
    -= new TypedEventHandler<SearchPane, SearchPaneResultSuggestionChosenEventArgs>(
    OnResultSuggestionChosen); }


    触发 “搜索建议事件” 时触发:

            private async void OnSearchPaneSuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs e)
            {
                var queryText = e.QueryText;
                if (!string.IsNullOrEmpty(queryText) && ! string.IsNullOrEmpty(UrlTextBox.Text))
                {
                     var request = e.Request;
                     var deferral = request.GetDeferral();
    
                    try
                    {
                         // 关于 XML 的建议格式描述: http://msdn.microsoft.com/en-us/library/cc848863(v=vs.85).aspx 
                        Task task = GetSuggestionsAsync(Regex.Replace(UrlTextBox.Text, "{searchTerms}", Uri.EscapeDataString(queryText)), 
    request.SearchSuggestionCollection);
    await task; if (task.Status == TaskStatus.RanToCompletion) { if (request.SearchSuggestionCollection.Size > 0) { // Suggestions provided for query: queryText } else { // No suggestions provided for query: queryText } } } catch (TaskCanceledException) { } catch (FormatException) { // Suggestions could not be retrieved, please verify that the URL points to a valid service
    //(for example
    http://contoso.com?q={searchTerms}) } catch (Exception) { // Suggestions could not be displayed, please verify that the service provides valid XML Search Suggestions } finally { deferral.Complete(); } } }


    向  Web Service 服务器请求数据 :

             private async Task GetSuggestionsAsync(string str, SearchSuggestionCollection suggestions)
            {
                // 如果没有完成,就取消之前向服务器发起的请求
                if (currentXmlRequestOp != null)
                {
                    currentXmlRequestOp.Cancel();
                }
    
                // 从 web service 获取数据.
                currentXmlRequestOp = XmlDocument.LoadFromUriAsync(new Uri(str));
                XmlDocument doc = await currentXmlRequestOp;
                currentXmlRequestOp = null;
    
                //返回包含指定名称的元素集合。
                  XmlNodeList nodes = doc.GetElementsByTagName("Section");
                if (nodes.Count > 0)
                {
                    IXmlNode section = nodes[0];
                    foreach (IXmlNode node in section.ChildNodes)
                    {
    
                      //节点的类型不为 XmlElement 类型。
                        if (node.NodeType != NodeType.ElementNode)
                        {
                            continue;
                        }
                        if (node.NodeName.Equals("Separator", StringComparison.CurrentCultureIgnoreCase))
                        {
                            string title = null;
                            IXmlNode titleAttr = node.Attributes.GetNamedItem("title");
                            if (titleAttr != null)
                            {
                                title = titleAttr.NodeValue.ToString();
                            }
                            suggestions.AppendSearchSeparator(string.IsNullOrWhiteSpace(title) ? "Suggestions" : title);
                        }
                        else
                        {
                            AddSuggestionFromNode(node, suggestions);
                        }
                    }
                }
            }

    把节点中的数据加载到  request.SearchSuggestionCollection 中:

            private void AddSuggestionFromNode(IXmlNode node, SearchSuggestionCollection suggestions)
            {
                string text = "";
                string description = "";
                string url = "";
                string imageUrl = "";
                string imageAlt = "";
    
                foreach (IXmlNode subNode in node.ChildNodes)
                {
                    if (subNode.NodeType != NodeType.ElementNode)
                    {
                        continue;
                    }
                    if (subNode.NodeName.Equals("Text", StringComparison.CurrentCultureIgnoreCase))
                    {
                        text = subNode.InnerText;
                    }
                    else if (subNode.NodeName.Equals("Description", StringComparison.CurrentCultureIgnoreCase))
                    {
                        description = subNode.InnerText;
                    }
                    else if (subNode.NodeName.Equals("Url", StringComparison.CurrentCultureIgnoreCase))
                    {
                        url = subNode.InnerText;
                    }
                    else if (subNode.NodeName.Equals("Image", StringComparison.CurrentCultureIgnoreCase))
                    {
                        if (subNode.Attributes.GetNamedItem("source") != null)
                        {
                            imageUrl = subNode.Attributes.GetNamedItem("source").InnerText;
                        }
                        if (subNode.Attributes.GetNamedItem("alt") != null)
                        {
                            imageAlt = subNode.Attributes.GetNamedItem("alt").InnerText;
                        }
                    }
                }
    
                if (string.IsNullOrWhiteSpace(text))
                {
                    // No proper suggestion item exists
                }
                else if (string.IsNullOrWhiteSpace(url))
                {
                    suggestions.AppendQuerySuggestion(text);
                }
                else
                {
                    // The following image should not be used in your application for Result Suggestions.  
    //Replace the image with one that is tailored to your content
    Uri uri = string.IsNullOrWhiteSpace(imageUrl) ? new Uri("ms-appx:///Assets/SDK_ResultSuggestionImage.png") : new Uri(imageUrl); RandomAccessStreamReference imageSource = RandomAccessStreamReference.CreateFromUri(uri); suggestions.AppendResultSuggestion(text, description, url, imageSource, imageAlt); } }


    当用户单击 “搜索建议列表” 中的数据时触发:

            private void OnResultSuggestionChosen(SearchPane sender, SearchPaneResultSuggestionChosenEventArgs e)
            {
                // Handle the selection of a result suggestion since the XML Suggestion Format can return these.
                //  Result suggestion selected with tag:  e.Tag
            }

    7、Open Search charm by typing :

         演示了如何让当用户在你的应用程序中时,通过 “输入文本”来打开搜索面板。

         如果你的应用加入了搜索协议,当用户在你应用的页面中输入文本时,能快速的打开搜索面板,

    这将是一个很好的体验。

        

    相应的代码:

      protected override void OnNavigatedTo(NavigationEventArgs e)
      {
          // 打开 “输入即显示搜索面板”
          SearchPane.GetForCurrentView().ShowOnKeyboardInput = true;
      }
    
      protected override void OnNavigatedFrom(NavigationEventArgs e)
      {
          // 关闭 “输入即显示搜索面板”
          SearchPane.GetForCurrentView().ShowOnKeyboardInput = false;
      }
  • 相关阅读:
    也谈用反射实现Enum→String映射:一种重视性能的方法【转载】
    C#对象的浅拷贝,深拷贝【转载】
    int转byte[],byte[]转int
    TF31003:您的用户帐户没有连接到 Team Foundation Server 的权限
    关于枚举的双语显示问题
    浅析C#深拷贝与浅拷贝
    反射枚举变量
    C#路径/文件/目录/I/O常见操作汇总(二)
    【转】正确理解ThreadLocal
    【转】JSP的九个隐含对象
  • 原文地址:https://www.cnblogs.com/hebeiDGL/p/2773714.html
Copyright © 2011-2022 走看看