在AutoCompleteBox组件中集成搜索引擎的功能是十分常见的,这有助于我们更好地与Web进行交互。本文将为大家讲述如何在在AutoCompleteBox组件中集成搜索引擎的搜索建议。

实例:

说明:本实例用的搜索引擎是微软的Bing(必应)

详细的说明在代码中给出。

WebServiceHelper.cs(业务辅助类)文件代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Globalization;

using System.Diagnostics.CodeAnalysis;

using System.Net;

using System.Windows.Browser;

using System.Windows.Controls;

namespace SilverlightClient

{

public static class WebServiceHelper

{

private const string LiveSuggestionsJsonUriFormat = "http://api.search.live.net/qson.aspx?query={0}";

private const string LiveSearchUriFormat = "http://search.live.com/results.aspx?q={0}";

public static bool CanMakeHttpRequests

{

get

{

if (!HtmlPage.IsEnabled)

{

return false;

}

string scheme = HtmlPage.Document.DocumentUri.Scheme ?? string.Empty;

return string.Compare(scheme, "http", StringComparison.OrdinalIgnoreCase) == 0;

}

}

public static Uri CreateWebSearchUri(string searchText)

{

return new Uri(string.Format(CultureInfo.InvariantCulture, LiveSearchUriFormat, HttpUtility.UrlEncode(searchText)));

}

public static Uri CreateWebSearchSuggestionsUri(string searchText)

{

return new Uri(string.Format(CultureInfo.InvariantCulture, LiveSuggestionsJsonUriFormat, HttpUtility.UrlEncode(searchText)));

}

}

}

MainPage.xaml文件代码:

<UserControl

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d" xmlns:input="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input" x:Class="SilverlightClient.MainPage"

d:DesignWidth="320" d:DesignHeight="240">

<Grid x:Name="LayoutRoot" Width="320" Height="240" Background="White">

<TextBlock Height="26" HorizontalAlignment="Left" Margin="8,8,0,0" VerticalAlignment="Top" Width="120" FontSize="16" Text="请输入搜索词:" TextWrapping="Wrap"/>

<input:AutoCompleteBox x:Name="Search" FontSize="14" FilterMode="None" Height="26" Margin="8,55,112,0" VerticalAlignment="Top" Width="200"/>

<Button x:Name="GoSearch" Height="26" HorizontalAlignment="Right" Margin="0,55,34,0" VerticalAlignment="Top" Width="74" Content="Search!" FontSize="13.333"/>

</Grid>

</UserControl>

MainPage.xaml.cs文件代码:

using System;

using System.Collections.Generic;

using System.Diagnostics.CodeAnalysis;

using System.Json;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Browser;

using System.Windows.Controls;

using System.ComponentModel;

namespace SilverlightClient

{

public partial class MainPage : UserControl

{

public MainPage()

{

InitializeComponent();

//注册事件触发处理

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

}

void MainPage_Loaded(object sender, RoutedEventArgs e)

{

if (WebServiceHelper.CanMakeHttpRequests)//如果能做Http请求

{

//注册AutoCompleteBox组件的下拉框内容正在生成事件触发处理

Search.Populating += Search_Populating;

//建立打开结果窗口的事件委托

Action go = () => HtmlPage.Window.Navigate(WebServiceHelper.CreateWebSearchUri(Search.Text), "_blank");

//注册AutoCompleteBox组件的KeyUp事件触发处理。当按下Enter键时,相当于提交

Search.KeyUp += (s, args) =>

{

if (args.Key == System.Windows.Input.Key.Enter)

{

go();

}

};

//搜素按钮的事件触发处理

GoSearch.Click += (s, args) => go();

}

}

private void Search_Populating(object sender, PopulatingEventArgs e)

{

AutoCompleteBox autoComplete = (AutoCompleteBox)sender;

//等待结果

e.Cancel = true;

//创建一个搜索建议请求

WebClient wc = new WebClient();

wc.DownloadStringCompleted += OnDownloadStringCompleted;

wc.DownloadStringAsync(WebServiceHelper.CreateWebSearchSuggestionsUri(autoComplete.SearchText), autoComplete);

}

private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)

{

AutoCompleteBox autoComplete = e.UserState as AutoCompleteBox;

if (autoComplete != null && e.Error == null && !e.Cancelled && !string.IsNullOrEmpty(e.Result))//如果没有出现异常情况的话

{

List<string> data = new List<string>();

try

{

JsonObject jso = ((JsonObject)JsonObject.Parse(e.Result))["SearchSuggestion"] as JsonObject;//创建Json对象

string originalSearchString = jso["Query"];//原始查询字符串

if (originalSearchString == autoComplete.SearchText)

{

foreach (JsonObject suggestion in (JsonArray)jso["Section"])

{

data.Add(suggestion.Values.First());

}

autoComplete.ItemsSource = data;//填充AutoCompleteBox组件的数据源

autoComplete.PopulateComplete();//结束AutoCompleteBox组件的下拉框内容生成

}

}

catch

{

}

}

}

}

}

最终效果图:

作者:Kinglee
文章出处:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

转载于:https://www.cnblogs.com/Kinglee/archive/2009/09/30/1577106.html

有关AutoCompleteBox组件的研究[5][Final]_集成搜索引擎搜索建议(Search Suggestion)——Silverlight学习笔记[40]...相关推荐

  1. 强大的DataGrid组件[4]_实现CURD[上]——Silverlight学习笔记[12]

    在本教程中,主要为大家讲述如何使用DataGrid来对后台数据库进行CURD操作.由于CURD操作是与数据库交互中最为常用的,因此掌握其使用方法就显得尤为必要.本教程将使用Linq to SQL Cl ...

  2. oracle 方泽宇_斯坦福大学CS520知识图谱系列课程学习笔记:第二讲如何构建知识图谱...

    上一讲我们学习了知识图谱的一些基本概念:泽宇:斯坦福大学CS520知识图谱系列课程学习笔记:第一讲什么是知识图谱​zhuanlan.zhihu.com 本节课程关于如何构建知识图谱,因为知识图谱的构建 ...

  3. 有关Expander组件的研究——Silverlight学习笔记[33]

    Expander组件常用做边栏目录的分类,比如Windows中"我的文档"的侧边栏.本文将为大家介绍该组件的基本特性以及实际应用. 组件所在命名空间: System.Windows ...

  4. 有关Rating组件的研究——Silverlight学习笔记[41]

    我们经常能在网上发现为新闻.博客文章.图片或是电影视频的评分功能.在Silverlight中,使用Rating组件便能助我们完成以上的功能.本文将为大家介绍该组件的基础知识以及自定义应用方面等方面的内 ...

  5. 有关Accordion组件的研究——Silverlight学习笔记[27]

    Accordion组件在开发中常用于信息的分类显示.本文将为大家介绍该组件的特性以及通过一个实例讲述该组件的基本运用. 组件所在命名控件: System.Windows.Controls 组件常用方法 ...

  6. 有关DataVisualization类组件的研究——Silverlight学习笔记[43]

    Data Visualization类组件以直观的图表方式显示数据的分布,能够让我们更好地分析各数据的内在联系.本文主要向大家介绍该类组件的基本特性以及使用实例. 一.基本特性介绍 1.chart组件 ...

  7. 有关Silverlight TreeView组件的研究[3]——Silverlight学习笔记(8)

    三.数据绑定与模板样式 说明:通过学习本文内容,您将了解到怎样动态地进行关于TreeView组件的数据绑定以及TreeViewItem组件的模板样式更改.本文给出基本的使用方法.   注:在Silve ...

  8. 有关Silverlight TabControl组件的研究——Silverlight学习笔记(5)

    说明:通过对于Silverlight TabControl组件及其子组件TabItem的学习,您将了解到该组件能够有效充分地利用屏幕空间,并且能展示大量的数据内容,使得应用程序的内容布局更趋合理. [ ...

  9. 有关Silverlight浮动窗体组件的研究——Silverlight学习笔记(3)

    说明:Silverlight的ChildWindow组件给我们的开发带来了便利,比如说我们可以用它开发自定义对话框等.然而,这同时也带来了这样一个问题,ChildWindow组件只能以Modal Wi ...

最新文章

  1. JavaWeb:JDBC之事务
  2. 临汾移动搜索引擎推广_竞价信息流移动搜索推广分析!
  3. Linux进程全解7——父进程wait / waitip回收子进程
  4. LightOJ 1197 Help Hanzo 素数筛
  5. easyui tree 默认选中第一个元素
  6. sql 如何设置行级锁_SQL Server中的行级安全性简介
  7. java载入器材_JAVA之了解类载入器Classloader
  8. 发那科机器人注油_安川机器人加油保养流程
  9. 烽火携手中航信斩获“十佳上云”优秀案例大奖
  10. RMXP脚本解析(四):Window_Base
  11. 小米怎么卸载html,小米11内容中心有什么用?怎么关闭和卸载呢
  12. 聚沙成塔,浙江形成1000 万千瓦“虚拟电厂”
  13. 【云和恩墨大讲堂】黄宸宁 - 一次特殊的 ORA-04030 故障处理
  14. 美国宾州计算机学校,美国留学,看看宾州有哪些顶尖学校?
  15. i3 10100f和i5 10400f 哪个好
  16. MyBatis 关联映射
  17. redhat还能坚持多久--红帽的“帽子戏法”
  18. 微信php签名验证_微信小程序API 用户数据的签名验证和加解密
  19. 形态世界的非定形现象
  20. 上海核酸72小时保质期,超过了码会变色吗?

热门文章

  1. linux虚拟机状态转换图,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
  2. php 递归合并类 call,PHP多个数组合并(递归的进行)
  3. 成人高考大学计算机基础答案,江苏省2019年成人高考大学计算机基础统考样卷...
  4. 中国医科大学计算机在线作业,中国医科大学《计算机应用基础》在线作业及参考 答案.doc...
  5. 微服务feignclient_微服务-(声明式调用feign)
  6. 二进制文件后缀_ZSY2018综合录井仪的数据流与数据文件
  7. 从码奴到码神之路--初级到中级再到高级程序员的进化之路
  8. 《软件建模技术》课程教学大纲
  9. HTTP协议中的Content-Encoding
  10. python Typing模块-类型注解