创建类似Outlook电子邮件收件人文本框的WPF文本框控件

7
我想创建一个类似于Outlook中电子邮件收件人文本框的WPF文本框控件。我并不是非常关心自动完成(我已经找到了数百万个示例),但我真正困扰的是如何使文本框中的分隔文本条目像Outlook中那样作为实体进行操作(一旦您输入的收件人解析出来,该文本就变成了“实体”,您可以单击它以选择,右键单击以获取上下文菜单等,它不再是您可以放置光标的“纯文本”)... 有没有高层次的想法如何实现这一点?是否知道任何现有的示例(我已经搜索了几个小时)?非常感谢您的帮助。
迈克尔。

也许这篇文章可以帮到你:介绍TagBox - xVir
看一下这个控件:http://blog.pixelingene.com/2010/10/tokenizing-control-convert-text-to-tokens/ - Sahadevan
1个回答

5

我的初步思路是这样的...(注意:我没有实际编写代码,所以我的细节可能有点不准确...)。

高级行为:

  • 你控制的数据类型是一个不可选择的项目列表。因此,你的控件大致上是一个ItemsControl(在视觉/XAML方面,它是一个带有WrapPanel样式布局和非常简单的TextBlock项目模板的ItemsControl)。
  • 当你的控件获得焦点时,你需要将模板切换为一个TextBox
  • 当你的控件失去焦点时,你需要拆分输入的文本并将其转换为列表以供显示。

因此,思考代码:

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

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

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

这应该给你基本的行为。你应该能够从控件外部绑定列表属性或字符串属性,不过你可能要小心如果绑定了两个属性会发生什么,因为它们之间存在双向依赖...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接