创建WPF文本框控件,如Outlook电子邮件收件人文本框

Mic*_*uer 7 wpf outlook xaml wpf-controls

我正在寻找创建一个WPF文本框控件,其作用类似于Outlook中的电子邮件收件人文本框(To,Cc和Bcc输入).我并不一定关心自动完成(我已经找到了数以百万计的例子),但我真正挣扎的是如何在文本框中将分隔的文本条目表现为实体的方式. Outlook(一旦您输入的收件人解析,该文本将成为您可以单击以选择的'实体',右键单击以获取上下文菜单等.它不再是'纯文本',您可以放置​​光标) ...

有没有人有任何高层次的想法如何实现这一目标?知道任何现有的例子(我用谷歌搜索了几个小时)?

非常感谢,提前,

迈克尔.

Dan*_*zey 5

我的粗略思考过程就是这个......(注意:我实际上并没有对它进行编码,所以我的细节可能有点偏离......).

高级行为:

  • 控件中的数据类型是一个不可选择的项目列表.因此,您的控件大约是ItemsControl(就视觉/ XAML而言,它是ItemsControl一个WrapPanel样式布局,TextBlock对于项目模板非常简单).
  • 当您的控件获得焦点时,您需要将模板切换为a TextBox
  • 当您的控件失去焦点时,您需要拆分输入的文本并将其转换为列表以供显示.

因此,思考代码:

  • 你需要一个UserControl,可能派生自ItemsControl.这为您提供了表示项目列表的基本行为.
  • 你需要一个DependencyProperty代表分隔字符串的控件上的自定义.
  • 当字符串属性更改时,您需要解析它并替换控件中的项列表.
  • 当list属性更改时,您需要将string属性替换为适当分隔的列表.

在代码隐藏方面,该部分应该非常简单.然后,对于XAML模板......

  • 您需要一个基本模板Items,使用WrapPanel上面提到的布局将您的属性显示为列表.
  • 当控件具有焦点时,您需要一个替换此模板的触发器.
  • 替换模板应该TextBox是绑定到控件的字符串属性的模板.
  • 在默认情况下具有约束力的行为TextBox将只推一个新的值时,TextBox失去焦点,所以你需要想想你是否要进行,比方说,一个"回车"按键将焦点(因此恢复的模板列表版本-当字符串属性的值更改,您的代码隐藏将更新列表).

这应该给你基本的行为.您应该能够从控件外部绑定list属性字符串属性,但是如果绑定两个属性,可能必须要小心,因为它们之间存在双向依赖关系...