WPF制作的一个小功能,智能提示(IntelliSense)

原文http://www.cnblogs.com/scheshan/archive/2012/06/30/2570867.html

最近WPF项目中遇到一个需求,需要给一个RichTextBox添加智能提示(IntelliSense)功能。

分析下具体的需求,在用户键入"@"符号时,应该显示一个弹出框,把所有用户列出。用户可以通过键盘、鼠标等进行选择。用户列表可能数据比较多,那么用户还应该可以输入字符进行筛选。用过各种IDE开发工具的童鞋应该对这样的效果很了解了,具体效果如下

输入@符号的效果:

筛选的效果:

再谈谈具体的开发思路.

1.如何制作可以实现列表选择功能的弹出框

  方法很多,Popup+ListBox可以完美解决.此处我为了省代码,直接用的ListBox

2.如何在键入@符号时,将ListBox显示在@符号之后

  在VisualStudio的智能提示里,当我们触发了IntelliSense时,提示框会显示,并且与下一字符的插入点对齐。TextPointer类提供了方法可以获取到某个插入点的坐标:

1     RichTextBox textbox = this.RichTextBox;
2     TextPointer start = textbox.Selection.Start;
3     Rect rect = start.GetCharacterRect(LogicalDirection.Forward);
4     Point point = rect.BottomLeft;

  我们可以注册RichTextBox的键盘事件,判断用户是否键入@符号。@符号是由“Shift”+“2”组成,Keyboard.Modifiers可以获取到组合键:

1 if (Keyboard.Modifiers == ModifierKeys.Shift && e.Key == Key.D2)
2 {
3     //TODO: 用户键入了@符号
4 }

  在TODO里,将ListBox移动到得到Point位置即可。

3.如何实现选择和筛选

  筛选功能很简单,保存一个局部变量,在智能提示框显示后记录用户输入,智能提示框隐藏后清空,智能提示框中的数据按照该变量进行过滤即可。

  当智能提示框显示的时候,用户是可以键入“上”,“下”键进行移动选择的。也许在敲了几次方向键,用户还想继续输入字符进行筛选。最开始,我是 用的ListBox自动的选择功能,当用户敲入方向键,我就将键盘焦点(WPF中分键盘焦点和逻辑焦点,这个也是困扰我很久的问题)设置到ListBox 上,那么用户就可以敲入“上”,“下”键进行移动选择了。看起来很简单,但是这样是有问题的,因为用户如果想继续敲入字符筛选,我还必须将键盘焦点重新设 置到RichTextBox上,否则用户的敲击是无效的。

  后来突然想通了,在用户敲击“上”,“下”键时,只需要调用ListBox的MoveCurrentToPrevious()和 MoveCurrentToNext()即可,这样给用户的错觉还是有了上下移动的效果。焦点不在ListBox上时,这样的移动可能造成当前选中项超出 了显示范围之外,那么可以通过ListBox的ScrollIntoView()方法,将选中对象滚动到视图中。

  下面是截取的一段代码:

 1           //如果按了向下键,则把选中项下移
 2                 if (e.Key == Key.Down)
 3                 {
 4                     if (UserList.CurrentPosition != UserList.Count - 1)
 5                     {
 6                         lbUser.Items.MoveCurrentToNext();
 7                         lbUser.ScrollIntoView(lbUser.Items.CurrentItem);
 8                     }
 9                     e.Handled = true;
10                 }
11                 //如果按了向上键,则把选中项上移
12                 if (e.Key == Key.Up)
13                 {
14                     if (UserList.CurrentPosition != 0)
15                     {
16                         lbUser.Items.MoveCurrentToPrevious();
17                         lbUser.ScrollIntoView(lbUser.Items.CurrentItem);
18                     }
19                     e.Handled = true;
20                 }

4.实现选中和取消
  选中功能就更简单了,分别加入对鼠标双击,空格,回车,TAB等的判断,将ListBox的当前选中项的文本插入到
RichTextBox中即可。需要注意的是,此处要对单击做判定,由于单击ListBox会使键盘焦点设置到其之上,因此要强制将键盘焦点从
ListBox移开。判断ESC键,使ListBox隐藏即可实现取消功能。

5.如何实现扩展

  做一个功能最重要的就是考虑以后的重用,此处可以公开
KeyBoard.Modifyers,KeyCode,IEnumable<T>为依赖属性,前2个代表在敲入什么组合键时会弹出智能提示
框,最后一个是弹出内容的数据源。由于此处的筛选功能是在控件内部,那么我们可以定义一个接口,包含一个Name属性。 

1 public interface IData
2 {
3     //用于筛选和插入的名称
4     string Name { get; set; }
5 }

  将上面的IEnumable<T>改为IEnumable<IData>。

  以后的调用方,只需要将这3个中的一个或多个传入,即可实现智能提示功能。

时间: 2024-12-31 11:41:28

WPF制作的一个小功能,智能提示(IntelliSense)的相关文章

WPF遇到的一个小问题

这两天又开始学习在VS2008种用WPF编写Windows应用程序,遇到了不少小问题. 下面几个错误困扰了好久: 已定义了一个名为"InitializeComponent"的具有相同参数类型的成员 已经包含"_contentLoaded"的定义 ... 类似的几个错误. 原因: 由于这几个控件是从另外一个复制过来的,xaml文件 x:Class后面的值没有改过来,还是原来控件对应的类.

编程-node.js如何编写添加朋友小功能?

问题描述 node.js如何编写添加朋友小功能? 请问,我用node.js编程,可以添加event 类似在博客或网站里添加一个小功能,--添加朋友.谁有类似的实例,请提示或者指教一下.谢谢.

Ajax实现智能提示搜索功能_AJAX相关

一.效果图: 二.实现过程:   思路:  三.部分代码:html: <div id="searchbox"> <div><input type="text" id="txtTitle" /></div> <div id="btnSelect"><a href="javascript:;">Google</a></di

Servlet+Ajax实现智能搜索框智能提示功能

利用无刷新技术智能变换搜索框的提示,同百度搜索 效果图 其基本原理: 1.给搜索框编写js绑定事件onkeyup(键盘输入时).onfocus(当鼠标点击搜索框外的时候清空提示) 2.首先获得用户输入.之后将获得的数据传给服务器,服务器将数据传给后台,后台获取服务器传来的数据进行处理,得到关联数据,向前端返回json格式,前端通过回调函数,将返回来的json解析成文本,将文本传输到搜索框下方的展示窗 如下为支持json的jar包 search.jsp <%@ page language="

显示-仿百度搜索框智能提示功能,在搜索关键字变色的功能里,输入数字会有问题

问题描述 仿百度搜索框智能提示功能,在搜索关键字变色的功能里,输入数字会有问题 仿百度搜索框智能提示功能,在搜索关键字变色的功能里,输入数字会有问题,如果数组中含有(1)数字,当文本框第一次按下1这个数字来搜索时,会出现问题,例如:数组中有2123,在文本框输入1,结果会显示2123[[[1]]]:如果数组中有两条或以上含有(1)数字的,则搜索结果第一行会这样显示,之后的都正常显示.输入","时也有问题,会出现一个标签字符串,原因是因为都","来分割的. 贴上我的搜

Visual Studio 2013开启JavaScript的智能提示功能

在前一次的发布的时候,我们共享了http://www.aliyun.com/zixun/aggregation/13969.html">Visual Studio 2013中Windows Azure移动服务的集成和功能.其中包含了移动服务表脚本的编辑能力的介绍.这一次的发布,我们将描述在Visual Studio中怎么样在你的服务器脚本中激活智能提示.这个功能并没有被集成到Visual Studio 2013 预览版中,下边的步骤可以帮助你把它打开. 开始之前,请从这里下载我们的Inte

PowerShell使用枚举变量定义带智能提示功能的函数参数_PowerShell

本文介绍在自定义PowerShell函数时,如何设置函数可以使用枚举变量智能提示参数值.枚举类型可以是.NET框架下的系统枚举类型. 在PowerShell 3.0版本中,出现了一项新的功能,那就是参数值的智能提示.当然,不是随便在哪里都会智能提示参数值,而是只能在ISE中.当然,所谓的ISE就是PowerShell自带的一个集成开发环境. 本文要介绍的是,使用系统自带的枚举变量来作为智能提示的列举选项. 我们把之前的Select-Color再拿出来看看, 复制代码 代码如下: function

PowerShell函数参数使用智能提示功能例子_PowerShell

本文介绍在自定义PowerShell函数时,如何设置函数可以智能提示参数值.参数值的智能提示这个功能是在PowerShell 3.0中出现的新功能. 在PowerShell 3.0版本中,出现了一项新的功能,那就是参数值的智能提示.当然,不是随便在哪里都会智能提示参数值,而是只能在ISE中.当然,所谓的ISE就是PowerShell自带的一个集成开发环境. 那么,我们自己在开发一个PowerShell函数时,我们应该怎么设置才能让我们的函数在ISE中也能智能提示参数的值呢?看看下面这个例子. 复

苹果产品增加了一个小秘书Siri功能

从iPhone4S发布开始,果粉们就发现,"苹果"产品增加了一个"小秘书"Siri功能,用户可以通过手机读短信.寻找餐厅.查询天气.语音设闹钟等.但国内一家公司指控"小秘书"Siri涉嫌侵犯其专利权.今天上午,上海市第一中级人民法院公开开庭审理了上海智臻网络科技有限公司诉苹果电脑贸易(上海)有限公司.苹果公司(Apple Inc.)侵害发明专利权纠纷案. 智臻网络称,其是专利号为ZL200410053749.9的一种聊天机器人系统的专利权人.该聊