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 restoreawait 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 contentUri 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;}

转载于:https://www.cnblogs.com/hebeiDGL/archive/2012/11/16/2773714.html

44、Search contract相关推荐

  1. Python中re的match、search、findall、finditer区别正则

    20210728 search 得到索引范围 原文地址: http://blog.csdn.net/djskl/article/details/44357389 这四个方法是从某个字符串中寻找特定子串 ...

  2. Python:正则表达式match、search、findall、finditer区别,group()、groups()与group(index)的区别

    1.match re.match(pattern, string[, flags]) 从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None, ...

  3. 1、存在如下数列1、1、2、4、7、13、24、44、81、149......现要求该数列第n项的值(n从O开始算)。 程序运行结果: 1/2 输入:4 输出:7 输入:9 输出:149

    ** 题目 ** /* 1.存在如下数列1.1.2.4.7.13.24.44.81.149-现要求该数列第n项的值(n从O开始算). 程序运行结果: 1/2 输入:4 输出:7 输入:9 输出:149 ...

  4. 3.odoo的学习(odoo中的视图:tree视图、form视图、search视图)

    目录 1.什么是视图 2.视图的声明方式 3.tree视图 4.form视图 5.search视图 6.优先级 1.什么是视图 在Odoo中,视图(view)定义了模型记录的显示方式. 每种类型的视图 ...

  5. js正则函数match、exec、test、search、replace、split使用集合

    match 方法 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回. stringObj.match(rgExp) 参数 stringObj 必选项.对其进行查找的 String 对 ...

  6. python中search和match的区别_Python中正则表达式match()、search()函数及match()和search()的区别详解...

    match()和search()都是python中的正则匹配函数,那这两个函数有何区别呢? match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找 ...

  7. js 中exec、test、match、search、replace、split用法

      前言:exec.test.match.search.replace.split在JS中用的很频繁,在网上看到对这些方法的总结,就转过来了,作个记录. exec:对string进行正则处理,并返回匹 ...

  8. react路由:路由传参params、search、state

    react路由:路由传参params.search.state(含二级路由和三级路由) 一.准备工作: ​ 1.创建myProject05-router目录 ​ 2.创建清单文件, npm init ...

  9. Elasticsearch From/Size、Scroll、Search After对比

    Elasticsearch From/Size.Scroll.Search After对比 From/Size 可以使用from和size参数对结果进行分页.from参数定义要获取的第一个结果的偏移量 ...

  10. ElasticSearch 的 from+size、scroll、scroll-scan、sliced scroll-sacn、search after

    参考文章: 使用scroll实现Elasticsearch数据遍历和深度分页 Elasticsearch 5.x 源码分析(3)from size, scroll 和 search after Ela ...

最新文章

  1. 随机取6位数字或字母方法
  2. ubuntu下安装kde Plasma
  3. python按位翻转_Python成为专业人士笔记-位操作符
  4. Qt文档阅读笔记-Qt工作笔记-QTableWidget::selectedItems()官方解析与实例(如何进行多选)
  5. 2022年第一个线上问题,被领导骂惨了!
  6. 使用Oracle VM VirtualBox创建的虚拟机与本地电脑(物理机)搭建局域网
  7. 组态王曲线控件读取access_组态王,历史趋势曲线控件例程说明文档
  8. EmEditor 常用功能
  9. MDM数据清洗功能开发说明
  10. linux I2C驱动实验
  11. Scrum敏捷开发框架
  12. Zookeeper如何保证数据一致性
  13. ipad远程控制windows电脑
  14. 黑苹果安装 hackintosh Lenovo Y50-70 TransMac 破解版安装
  15. 推荐一个在线绘图工具ProcessOn----支持流程图、思维导图、UML等
  16. Spring boot整合Drools、flowable决策引擎解决方案
  17. wince之WiFi漫游的工作原理
  18. java获取服务器ip地址_java中获取当前服务器的Ip地址的方法
  19. C# 7.0 SPANS
  20. STM32定时器-6步PWM输出

热门文章

  1. 【Windows】电脑清理个人隐私数据信息
  2. 毕业即失业,转行软件测试的辛酸泪只有自己知道
  3. 3种常见的统计学方法
  4. 邮件营销EDM运营笔记:选择合适的EDM平台
  5. LOJ 6229 LCM / GCD (杜教筛+Moebius)
  6. flv 视频播放器代码
  7. pandas读取xls文件
  8. 网站SEO优化的关键词密度怎么布局才算合理
  9. 明日之后手机正版服务器,明日之后能不能换区 明日之后手游渠道服怎么转换成网易官方服...
  10. 笔记本光驱改固态硬盘装系统小记