WPF控件开发(2) 自动完成(AutoComplete)-1
自动完成功能使用范围很广,多以TextBox或ComboBox的形式出现,在输入的同时给予候选词,候选词一般有两种方式获取。
- 一种类似Baidu,Google,Bing之类的搜索引擎所用的直接给予前十个候选词,或者VS等IDE的自动完成,这种多以文本输入为准,候选词只作为·候选·所用;
- 较之第一种,管理类软件中可能会以筛选的形式出现。与第一种不同之处,就是这里可能注重的是选择一条数据,输入的文本只是用来·筛选·。
由此可看出,自动完成功能,就是为了提高用户体验,如果稍稍留心,会发现我们使用操作系统,软件,浏览器的时候,有各式各样的自动完成功能。
百度首页
我本想只做一个简单的例子,不涉及界面部分,但是一时兴起,做了一个山寨版的百度首页,界面费了不少时间。

由于这里使用的是TextBox,所以重写了TextBox的模板,给里面放了一个Popup一个ListBox,然后对一些键盘鼠标事件进行操作,基本不难理解,至于Suggestion服务,就是解析json对象的问题,这里用现成的东西。
public string[] GetItems(string textPattern)
{
string _uriFormat = @"http://suggestion.baidu.com/su?wd={0}";
WebRequest request = null;
WebResponse response = null;
try
{
var uri = new Uri(string.Format(_uriFormat, HttpUtility.UrlEncode(textPattern)));
request = WebRequest.Create(uri);
try
{
response = request.GetResponse();
}
catch
{
return null;
}
object[] jsonResult;
using (var stream = response.GetResponseStream())
{
var reader = new StreamReader(stream, Encoding.Default);
var json = reader.ReadToEnd();
Regex rege = new Regex(@"s:(\[.*\])");
var mat = rege.Match(json).Groups[];
jsonResult = _jsonSerializer.DeserializeObject(mat.Value) as object[];
}
return jsonResult.Cast<string>().ToArray();
}
finally
{
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
}
}

输入缓冲
关于输入缓冲,早在做ComboBox的时候就需要。
所谓输入缓冲,在这里的意思就是不在每次文本改变的时候去根据输入查询,而是有一定的缓冲,因为可能我需要的是12306,而不是123的结果。
当然,实现方式也有很多,这里我只是使用了Timer实现。
_interval.Elapsed += (s1, e1) =>
{
_interval.Stop();
_isKeyEvent = false;
string input = string.Empty;
txtSearch.Dispatcher.Invoke(new Action(() => input = txtSearch.Text));
var lst = GetItems(input);
_listSuggestion.Dispatcher.Invoke(new Action(() => _listSuggestion.ItemsSource = lst));
_popupSuggestion.Dispatcher.Invoke(new Action(() => _popupSuggestion.IsOpen = lst.Length > ));
};
其实就是将原本在TextChanged事件处理函数里的代码挪到Elapsed事件里面来,TextChanged里面只需要判断是否是键盘输入,是的话就让他重置一次:
if (_isKeyEvent)
{
_interval.Stop();
_interval.Start();
}
所遇问题
我曾经在一篇介绍ComboBox的博客中说了使用ComboBox做自动完成功能时遇到的问题,这次与ComboBox自是不相同,但是也遇到不少问题。
- Popup,ListBox与TextBox操作出现的问题
- Popup展开时切换窗口
- 鼠标选择ListBox某一条
- 逻辑焦点在ListBox,输入焦点在TextBox上
其实与其把这些说成WPF的问题,不如说是WPF灵活的一种表现,所幸这些常见的问题都有相应的解决方案。
看源码学习确实很好,但是往往源码过于复杂,根本无从看起,这时候就应该以最小功能去实现,然后碰到问题看他人是如何解决。
其实软件发展到今天,很多东西早有人已经实现,认认真真看完一篇宏伟的工程,有时比自己一个劲的瞎琢磨要好的多。
WPF控件开发(2) 自动完成(AutoComplete)-1的更多相关文章
- wpf控件开发基础(3) -属性系统(2)
原文:wpf控件开发基础(3) -属性系统(2) 上篇说明了属性存在的一系列问题. 属性默认值,可以保证属性的有效性. 属性验证有效性,可以对输入的属性进行校验 属性强制回调, 即不管属性有无发生变化 ...
- wpf控件开发基础(2) -属性系统(1)
原文:wpf控件开发基础(2) -属性系统(1) 距离上篇写的时间有1年多了.wpf太大,写的东西实在太多,我将依然围绕着自定义控件来展开与其相关的技术点. 也欢迎大家参与讨论.这篇我们将要讨论的是W ...
- wpf控件开发基础
wpf控件开发基础(3) -属性系统(2) http://www.cnblogs.com/Clingingboy/archive/2010/02/01/1661370.html 这个有必要看看 wpf ...
- wpf控件开发基础(4) -属性系统(3)
原文:wpf控件开发基础(4) -属性系统(3) 知识回顾 接上篇,上篇我们真正接触到了依赖属性的用法,以及依赖属性的属性元数据的用法,并且也实实在在地解决了之前第二篇提到的一系列问题.来回顾一下 属 ...
- wpf控件开发基础(5) -依赖属性实践
原文:wpf控件开发基础(5) -依赖属性实践 知识回顾 接上篇,回顾这三篇讲了什么东西 首先说明了属性的现存问题,然后介绍了依赖属性的基本用法及其解决方案,由于依赖属性以静态属性的方式存在,进而又介 ...
- 浅尝辄止——使用ActiveX装载WPF控件
1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...
- C# Winform开发以及控件开发的需要注意的,被人问怕了,都是基础常识
我是搞控件开发的,经常被人问,所以把一些问题记录了下来!如果有人再问,直接把地址丢给他看. 一. 经常会有人抱怨Winform界面闪烁,下面有几个方法可以尽可能的避免出现闪烁 1.控件的使用尽量以纯色 ...
- WPF 控件库——轮播控件
WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...
- 【WPF】创建基于模板的WPF控件(经典)
原文:[WPF]创建基于模板的WPF控件(经典) WPF可以创建两种控件,它们的名字也很容易让人混淆:用户控件(User Control)和定制控件(Customer Control),之所以如此命名 ...
随机推荐
- mui的ajax例子3
mui.get() 前端页面: <!DOCTYPE html><html><head> <meta charset="utf-8"> ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...
- Windows服务器高并发处理IOCP(完成端口)详细说明
一. 完成端口的优点 1. 我想只要是写过或者想要写C/S模式网络服务器端的朋友,都应该或多或少的听过完成端口的大名吧,完成端口会充分利用Windows内核来进行I/O的调度,是用于C/S通信模式中性 ...
- c++ STL map容器成员函数
map容器用于查找,设置键值和元素值,输入键值,就能得到元素值.map对象中的元素时刻都是有序的,除非无序插入的.它是用平衡树创建的.查找很快. 函数 描述,注意有r的地方都是不能用it代替的. ma ...
- dac verilog ad5601
首先从官网下载数据手册.DAC有串行有并行,ad5601是串行,(需要好多时钟沿的移位内部转换为并行在输出). 按照手册的时序编写程序, 关注下芯片的波特率范围 看看手册的数据传输那些事有效的数据位 ...
- 更新KB915597补丁后导致“您的windows副本不是正版”的解决方案
更新KB915597补丁后导致“您的windows副本不是正版”的解决方案 解决方法: 运行cw.exe(https://pan.lanzou.com/i05ya8h),直至提示成功: 重新启动操作系 ...
- hiho一下 第三十八周 二分答案
题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...
- hihocoder 1080 线段树(区间更新)
题目链接:http://hihocoder.com/problemset/problem/1080 , 两种操作的线段树(区间更新). 这道题前一段时间一直卡着我,当时也是基础不扎实做不出来,今天又想 ...
- 如何处理CloudFoundry应用部署时遇到的254错误
使用SAP云平台的CloudFoundry部署应用: 在cockpit遇到错误信息:instance: a0abe2b5-7623-4cf1-4c65-0c79, index: 0, exit_des ...
- java中list强转为map类型
起因:读取数据库文件的测试用例,测试用例需要存放到一个map中,方便下次调用, 读取的内容返回的内容存放在一个list中,并且数据内容是key=value的形式,最开始使用切片方式,做了很多无用功,后 ...