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个中的一个或多个传入,即可实现智能提示功能。

posted on 2013-07-25 08:39 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3213592.html

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

  1. WPF制作贪吃蛇小游戏

    初学WPF,需要一个小程序来锻炼自己,而贪吃蛇是每一个小白(包括我自己)必学的经典案例,此文就来介绍一下,接近完美的贪吃蛇是如何制作的 . . . 学习源于赵庆明老师的课程(腾讯课堂) 此文将只对游戏 ...

  2. 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!

    /* 最近写了一个自动收邮件的机器人,原来一开始偷懒"娶"了 COM 组件 JMail: <封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集), ...

  3. 给你30秒的时间,你会用Excel制作出一个抽奖功能吗?

    一说到抽奖,大家都是想到最近的"支付宝锦鲤信小呆",但是今天跟大家谈论的不是这个,而是:你会用Excel制作抽奖功能吗?可能大家都不知道Excel有这么多的神技能,但是你不知道的还 ...

  4. 因为一个小功能,我对微信手机号转账的好感度加了10分

    微信支付上线了"手机号转账"功能,不加好友也能转账,这就意味着再也不能通过微信加好友转账来套路小姐姐微信了,但你可以通过手机号转账功能直接找小姐姐要手机号码. 作为一个稍微有点安全 ...

  5. 【前端学习一】【网页设计】利用HTML和CSS制作了一个小网页.

    前言 最近在学习前端,光看不练是空谈,利用课下时间以及课上时间做了一个小网页,其中利用到了HTML和CSS.网页非常简单,功能也非常少,但还是出现了许多错误,有一些妥协性,而且目前从制作中还遗留了许多 ...

  6. 【VC++】Visual Studio编辑器“智能提示(IntelliSense)”异常的解决方案

    许多用户在使用Visual Studio的过程中,常会遇到"智能提示(IntelliSense)"功能异常的情况,这里提供几种用于解决这一问题的方法,希望对各位有用. 原文地址:H ...

  7. WPF制作随机抽奖小程序

    前些天学完了一些WPF的基础知识,闲来无事做了一个随机抽奖的小程序, 代码比较简单,核心的代码只有七行,其它的都是一些布局上的事情 . . 希望这个例子,能够帮助你, 大佬可以指点指点我, ^ _ ^ ...

  8. 自己制作的一个小网站--张晶塑料包装制品厂

    本人在暑假期间曾尝试制作一个网页,前后花了一个多月的时间,现在终于有点起色了,于是写篇文章来回顾一下制作历程,也是对这一个多月来的内容进行小小总结.由于能力水平有限,做的网页非常普通,甚至有点丑,还请 ...

  9. 假如你能给「微信」增加一个小功能

    张小龙曾经调侃:每天有1亿人教我做产品. 我们都知道,用户提的需求,基本操作是扔进需求池,优先级拉到最低的. 但如果是产品经理提需求呢?会不会有点参考价值呢? 上周小编同学在社群提问: 以下分组整理了 ...

最新文章

  1. [codeforces 508E]Maximum Matching
  2. mft文件记录属性头包括_NTFS 文件系统基础知识
  3. 手把手演示:如何规划一个企业级数据中台
  4. 无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
  5. 台式电脑计算机无法启动 启动修复,遇到计算机无法启动时,该怎么修复?
  6. MySQL Show命令的使用
  7. Project FreeEIM 2.0:重现失落的飞鸽传书
  8. php 数组相乘,PHP如何计算数组中所有值的乘积?(代码示例)
  9. linux 退出java,linux kill命令下如何优雅的退出java程序
  10. 川大计算机生物学怎么样,四川大学生物信息学初试经验分享
  11. Delphi版 IsNumeric 函数
  12. oracle var/tmp,[20141128]目录/var/tmp/oracle.txt
  13. 根据key或value将map容器进行排序
  14. WINDOWS下,找包含特殊字串的文件的解决办法
  15. VMware 中软盘镜像文件 *.flp 使用方法
  16. ScreenToGif2.19.3中文版GIF录制工具
  17. Asterisk-Javanbsp;教程(中文版)…
  18. MAC Photoshop标题栏不见了
  19. vue博客模板—Gblog
  20. 远程IT运维的升级,“团队协作”

热门文章

  1. web怎么用代码创造表格_Python新工具:用三行代码提取PDF表格数据
  2. vr体验馆项目_VR安全体验馆在江苏方洋项目推广应用啦!
  3. ms17-010 php版本,那年MS17-010
  4. 使用animate实现页面过度_很多人都在使用的开源CSS动画效果库——animate.css
  5. An Algorithm Summary of Programming Collective Intelligence
  6. TextVQA论文汇总
  7. 世界对一名颓废者的惩罚——SDOI2019游记
  8. c 语言 指针 指向数组,C 指向数组的指针
  9. 什么是java泛型_java泛型背后是什么
  10. datatables屏蔽警告弹窗