`
java-mans
  • 浏览: 11460758 次
文章分类
社区版块
存档分类
最新评论

Windows 8 Metro App开发[12]Windows 8 中搜索合约的使用

 
阅读更多

注:本系列学习帖子我在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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics