给Metro风格RSS阅读器加个搜索

上回写过一个简单的Win8 Metro风格的RSS阅读器,详见http://boytnt.blog.51cto.com/966121/860937,今天给它加一个搜索功能。先看图:

用的是Metro App标准的搜索功能(SearchPane),按键盘Win+Q可以调出来。

上代码,MainPage.xaml.cs:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Net.Http; 
using System.Text; 
using Windows.ApplicationModel.Search;    //SearchPane定义在这个命名空间下 
using Windows.Data.Xml.Dom; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 
 
namespace Rss 
{ 
    public sealed partial class MainPage : Page 
    { 
        private SearchPane m_SearchPane; 
 
        public MainPage() 
        { 
            this.InitializeComponent(); 
 
            //获取当前View的搜索面板 
            m_SearchPane = SearchPane.GetForCurrentView(); 
            //提示文字,未输入时提示用户的 
            m_SearchPane.PlaceholderText = "输入标题"; 
            //提交时的Handler 
            m_SearchPane.QuerySubmitted += SearchPane_QuerySubmitted; 
            //根据用户输入给出建议的Handler 
            m_SearchPane.SuggestionsRequested += SearchPane_SuggestionsRequested; 
        } 
 
        private void SearchPane_QuerySubmitted(SearchPane sender, SearchPaneQuerySubmittedEventArgs args) 
        { 
            var articles = gvArticles.ItemsSource as List<BlogArticle>; 
            foreach (var article in articles) 
            { 
                if (article.Title == args.QueryText) 
                { 
                    //跳转 
                    Redirect(article); 
                    break; 
                } 
            } 
        } 
 
        private void SearchPane_SuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args) 
        { 
            var articles = gvArticles.ItemsSource as List<BlogArticle>; 
            foreach (var article in articles) 
            { 
                if (article.Title.IndexOf(args.QueryText, StringComparison.CurrentCultureIgnoreCase) >= 0) 
                { 
                    //符合条件的加入到建议中 
                    args.Request.SearchSuggestionCollection.AppendQuerySuggestion(article.Title); 
                } 
            } 
        } 
 
        protected override async void OnNavigatedTo(NavigationEventArgs e) 
        { 
            //内容略,见上回的代码吧 
        } 
 
        private void gvArticles_SelectionChanged(object sender, SelectionChangedEventArgs e) 
        { 
            var articles = gvArticles.ItemsSource as List<BlogArticle>; 
            int index = gvArticles.SelectedIndex; 
 
            Redirect(articles[index]); 
        } 
 
        private void Redirect(BlogArticle article) 
        { 
            //先去掉Handler,不然重复挂载会造成多次响应 
            m_SearchPane.QuerySubmitted -= SearchPane_QuerySubmitted; 
            m_SearchPane.SuggestionsRequested -= SearchPane_SuggestionsRequested; 
 
            rootPage.Frame.Navigate(typeof(ArticlePage), article); 
        } 
    } 
}


代码不复杂,不过想要运行,还必须声明本程序支持搜索功能,打开Package.appxmanifest文件,添加一个针对&ldquo;搜索&rdquo;的声明,如图:


另外VS版本升级了一下,似乎变化不大哦。