Windows Store apps开发[12]Windows 8 中搜索合约的使用

来源:互联网 发布:sql分组查询所有数据 编辑:程序博客网 时间:2024/05/01 17:57

注:本系列学习帖子我在DevDiv.com移动开发社区原创首发

        转载请注明出处:BeyondVincent(破船)@DevDiv.com

如果你有什么问题也可以前往交流

下面是首发地址:

[DevDiv原创]Windows 8 Metro App开发Step by Step---(13个学习帖子)



      在上一篇文章,我给大家介绍了Windows 8中的合约,如果你还没有看的话,建议你先去阅读一下。在本篇文章中,我将利用搜索合约,来跟大家介绍合约的使用。为了演示的方便,本次示例我使用下面这篇文章中的示例进行改进。

Windows 8 Metro App开发[7]视图模型与数据绑定


本文的内容结构如下:

1、搜索合约的声明

2、搜索的激活

3、提交查询的候选项

4、运行效果和示例代码


更多内容请查看下面的帖子


Windows 8 Metro App开发Step by Step

1、搜索合约的声明

   我们打开上面提到的示例程序,并打开Package.appxmanifest文件,选择声明选项卡,如下图,并找到选择搜索声明,然后添加:




    然后我们部署应用程序到计算机上。部署完毕之后,按Windows+Q组合键,可以看到,我们的示例程序:搜索合约测试已经在搜索面板中了。如果这里不添加搜索声明的话,在搜索面板中是看不到的。如下两图所示(左图是已经添加搜索声明的,右图则是没有添加)
           

2、搜索的激活
    打开App.xml.cs文件,在其中添加如下函数

protected override void OnSearchActivated(SearchActivatedEventArgs args){    viewModel.SearchAndSelect(args.QueryText);}

当应用程序以显示搜索结果为目的被激活时,该方法会被调用,也就是说,从搜索面板中输入内容,然后回车可以激活该方法。
在这里,我把viewModel的位置放到App里面了,这样方便调用。在viewModel方法中我添加了一个方法SearchAndSelect,该方法用于搜索内容。代码如下:该代码的左右就是查找出ForumItemList 中name与搜索内容符合的字段,并记录相关的index。
public void SearchAndSelect(string searchTerm){    int selIndex = -1;    for (int i = 0; i < ForumItemList.Count; i++)    {        if (ForumItemList<i>.Name.ToLower().Contains(searchTerm.ToLower()))        {            selIndex = i;            System.Diagnostics.Debug.WriteLine(ForumItemList<i>.Name);            break;        }    }    SelectedItemIndex = selIndex;}

为了在界面上让搜索命中相选中,我还对SelectedItemIndex进行了监听,如果发生改变则界面先择也相应的进行改变,如下代码

viewModel.PropertyChanged += (sender, args) =>{    if (args.PropertyName == "SelectedItemIndex")    {        ForumList.SelectedIndex = viewModel.SelectedItemIndex;    }};

这样,当SelectedItemIndex 改变的时候,界面上的选中项也会发生改变。

3、提交查询的候选项
    为了加强用户体验,方便用户选择搜索内容,我们可以在搜索面板添加一些搜索的候选项。当用户在输入内容的时候,按照一定的规则,给用户列出适合的内容。
    首先需要做的事情就是监听SuggestionRequested事件,当用户开始在搜索框中输入内容时,就会触发该事件。那么我们可以通过下面的代码进行注册:注意在这里需要增加using Windows.ApplicationModel.Search;否则会出现错误。

SearchPane.GetForCurrentView().SuggestionsRequested += searchPane_SuggestionsRequested;

    当SuggestionRequested事件来的时候,我们就可以发送候选项建议了。就像查询一样,候选项内容可以来自网络服务,或者自行组合,在这里为了演示目的,我从ForumItemList中获取内容,在SearchPageSuggestionsRequestedEventArgs实例中,我们可以把候选项添加到SearchSuggestionCollection中,SearchSuggestionCollection中的内容会显示在搜索面板中。因为当用户每次输入内容的时候,该方法都会被调用,因此一定要注意该函数的编写。下面是我的代码:
    需要注意的是搜索面板只能显示最多5个候选项
void searchPane_SuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args){    foreach (ForumItem forumItem in viewModel.ForumItemList)    {        string suggestion = forumItem.Name;        if (suggestion.StartsWith(args.QueryText, StringComparison.CurrentCultureIgnoreCase))        {            args.Request.SearchSuggestionCollection.AppendQuerySuggestion(suggestion);        }        if (args.Request.SearchSuggestionCollection.Size >= 5)        {            break;        }    }}

这样我们就成功的在程序中实现了搜索合约功能。下面我们看看运行效果

4、运行效果和示例代码
实运行程序,调出搜索面板(Windows键+Q),输入W字母,看到如下效果图,在右边列出了以W开头的两个候选项



选择第二项:Windows 8 开发论坛,此时左边的对应项会被选中,如下图所示:



到此,搜索合约的讲解就结束了,欢迎大家的阅读。
下面附上相关代码工程

 DevDiv_DataBinding.rar 


原创粉丝点击