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

时间:2010-05-10 21:13:29

标签: wpf xaml outlook wpf-controls

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

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

非常感谢,

迈克尔。

1 个答案:

答案 0 :(得分:5)

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

高级行为:

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

因此,思考代码:

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

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

  • 您需要一个基本模板,使用上面提到的Items布局将您的WrapPanel属性显示为列表。
  • 当控件具有焦点时,您需要一个替换此模板的触发器。
  • 替换模板应该是绑定到控件的字符串属性的TextBox
  • TextBox上的默认绑定行为只会在TextBox失去焦点时推送新值,因此您需要考虑是否要进行“输入”按键移动焦点(因此将模板恢复为列表版本 - 当字符串属性的值更改时,您的代码隐藏将更新列表)。

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