Создание Управления Текстовым полем WPF как текстовое поле получателя электронной почты Outlook

Я надеюсь создавать управление текстовым полем WPF, которое действует подобное почтовым текстовым полям получателя в Outlook (К, Cc и исходные данные Bcc). Я не обязательно забочусь так очень об автозавершении (я нашел миллионы примеров для того), но с чем я действительно борюсь, то, как иметь записи разделенного текста в текстовом поле, ведут себя как объекты путем, они делают в Outlook (однажды получатель, Вы ввели твердость, тот текст становится 'объектом', который можно нажать для выбора, щелкните правой кнопкой для получения контекстного меню, и т.д. это не более длинный 'простой текст', в который можно установить курсор)...

У кого-либо есть какие-либо идеи высокого уровня, как выполнить это? Знайте о каких-либо существующих примерах (я гуглил в течение многих часов)?

Большое спасибо заранее,

Michael.

7
задан Justin XL 11 September 2012 в 06:53
поделиться

1 ответ

Мой примерный ход мыслей был бы таким... (Примечание: на самом деле я не кодирую это, поэтому мои детали могут быть немного неточными...).

Высокоуровневое поведение:

  • тип данных в вашем контроле - это список элементов, которые нельзя выбрать. Поэтому ваш элемент управления является, приблизительно, ItemsControl (с точки зрения визуального/XAML, это ItemsControl с WrapPanel стилем компоновки и очень простым TextBlock для шаблона элемента).
  • когда ваш элемент управления получает фокус, вам нужно переключить шаблон на TextBox
  • когда ваш элемент управления теряет фокус, вам нужно разделить введенный текст и преобразовать его в список для отображения.

Поэтому, думая над кодом:

  • вам нужен UserControl, возможно, производный от ItemsControl. Это даст вам базовое поведение для представления списка элементов.
  • вам нужен пользовательский DependencyProperty на вашем контроле, который представляет разграниченную строку.
  • когда свойство string изменяется, вам нужно разобрать его и заменить список элементов в элементе управления.
  • когда свойство list изменяется, вам нужно заменить свойство string на список с соответствующим разграничением.

С точки зрения code-behind эта часть должна быть довольно простой. Затем, для шаблона XAML...

  • вам нужен базовый шаблон, который отображает ваше свойство Items в виде списка, используя упомянутый выше макет WrapPanel.
  • вам нужен триггер, который заменяет этот шаблон, когда элемент управления имеет фокус.
  • заменяющий шаблон должен быть TextBox, который привязан к свойству string элемента управления.
  • поведение привязки по умолчанию для TextBox будет только подталкивать новое значение, когда TextBox теряет фокус, поэтому вам нужно подумать, хотите ли вы сделать так, чтобы, скажем, нажатие клавиши "Enter" перемещало фокус (тем самым возвращая шаблон к версии списка - когда значение свойства string меняется, ваш codebehind будет обновлять список).

Это должно дать вам базовое поведение. Вы должны иметь возможность привязать либо свойство list либо свойство string извне элемента управления, хотя вам, возможно, придется быть осторожным с тем, что произойдет, если вы привяжете оба свойства, поскольку между ними существует двусторонняя зависимость...

5
ответ дан 7 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: