注:本系列学习帖子我在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、运行效果和示例代码
1、搜索合约的声明
我们打开上面提到的示例程序,并打开Package.appxmanifest文件,选择声明选项卡,如下图,并找到选择搜索声明,然后添加:
![](https://img-my.csdn.net/uploads/201208/11/1344669042_4791.png)
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开头的两个候选项
![](https://img-my.csdn.net/uploads/201208/11/1344669148_3046.png)
选择第二项:Windows 8 开发论坛,此时左边的对应项会被选中,如下图所示:
![](https://img-my.csdn.net/uploads/201208/11/1344669162_4742.png)
到此,搜索合约的讲解就结束了,欢迎大家的阅读。
下面附上相关代码工程