【问题标题】:Creating a WPF Textbox Control like Outlook email recipient textbox创建一个 WPF 文本框控件,如 Outlook 电子邮件收件人文本框
【发布时间】:2010-05-10 21:13:29
【问题描述】:
我希望创建一个 WPF 文本框控件,其作用类似于 Outlook 中的电子邮件收件人文本框(收件人、抄送和密件抄送输入)。我不一定那么关心自动完成(我已经找到了数百万个例子),但我真正苦苦挣扎的是如何让文本框中的分隔文本条目像实体一样表现Outlook(一旦您输入的收件人解析,该文本将成为一个“实体”,您可以单击以选择,右键单击以获取上下文菜单等。它不再是您可以放置光标的“纯文本”) ...
有没有人有任何高层次的想法如何做到这一点?知道任何现有的例子(我已经用谷歌搜索了几个小时)?
非常感谢,
迈克尔。
【问题讨论】:
标签:
wpf
xaml
outlook
wpf-controls
【解决方案1】:
我粗略的思考过程是这样的……(注意:我实际上并没有编写代码,所以我的细节可能有点不对……)。
高级行为:
- 控件中的数据类型是不可选择的项目列表。因此,您的控件大约是一个
ItemsControl(就视觉/XAML 而言,它是一个 ItemsControl,具有 WrapPanel 样式布局和非常简单的 TextBlock 项目模板)。
- 当您的控件获得焦点时,您需要将模板切换为
TextBox
- 当您的控件失去焦点时,您需要将输入的文本拆分并转换为列表进行显示。
因此,思考代码:
- 您需要一个可能从 ItemsControl 派生的 UserControl。这为您提供了表示项目列表的基本行为。
- 您需要在控件上自定义
DependencyProperty 来表示分隔字符串。
- 当字符串属性发生变化时,需要对其进行解析并替换控件中的项列表。
- 当列表属性发生变化时,您需要将字符串属性替换为适当分隔的列表。
就代码隐藏而言,这部分应该非常简单。然后,对于 XAML 模板...
- 您需要使用上述
WrapPanel 布局将Items 属性显示为列表的基本模板。
- 您需要一个在控件具有焦点时替换此模板的触发器。
- 替换模板应该是绑定到控件字符串属性的
TextBox。
-
TextBox 上的默认绑定行为只会在 TextBox 失去焦点时推送一个新值,因此您需要考虑是否要制作,例如,“Enter”键移动焦点(从而恢复模板到列表版本 - 当字符串属性的值更改时,您的代码隐藏将更新列表)。
这应该给你基本的行为。您应该能够从控件外部绑定列表属性或字符串属性,但您可能必须小心如果绑定两个属性会发生什么,因为两者之间存在双向依赖关系他们……