2010-05-10 21 views
7

Estoy buscando crear un control de cuadro de texto WPF que actúe de forma similar a los cuadros de texto del destinatario en Outlook (las entradas A, Cc y Bcc). No necesariamente me importa mucho la autocompletación (he encontrado millones de ejemplos para eso), pero lo que realmente me cuesta es cómo hacer que las entradas de texto delimitadas en el cuadro de texto se comporten como entidades de la manera en que lo hacen en Outlook (una vez que un destinatario ingresado se resuelve, ese texto se convierte en una 'entidad' en la que puede hacer clic para seleccionar, hacer clic derecho para obtener un menú contextual, etc. ya no es 'texto plano' en el que puede colocar el cursor) ...Creando un cuadro de texto WPF Control como el cuadro de texto del destinatario de Outlook

¿Alguien tiene ideas de alto nivel sobre cómo lograr esto? ¿Conoces algún ejemplo existente (he buscado en Google durante horas)?

Muchas gracias de antemano,

Michael.

+0

Quizás este artículo puede ayudarlo: [Introduciendo TagBox] (http://www.thesilvermethod.com/Default.aspx?Id=IntroducingTagBox) – xVir

+0

http://blog.pixelingene.com/2010/10/tokenizing- control-convert-text-to-tokens/ - Eche un vistazo a este control – Sahadevan

Respuesta

5

Mi proceso de pensamiento aproximado sería este ... (nota: en realidad no lo estoy codificando, por lo que mis detalles pueden estar un poco ralentizados ...).

alto nivel de comportamiento:

  • el tipo de datos en su control es una lista de elementos que no pueden seleccionarse. Por lo tanto, su control es, aproximadamente, ItemsControl (en términos de visual/XAML, es ItemsControl con un diseño de estilo WrapPanel y TextBlock muy simple para la plantilla del elemento).
  • cuando sus ganancias de control se centran, es necesario cambiar la plantilla a ser un TextBox
  • cuando el control pierde el foco, es necesario dividir el texto introducido y convertirlo en una lista para su visualización.

Por lo tanto, el código de pensar:

  • necesita un control de usuario, posiblemente deriva de ItemsControl. Eso le da un comportamiento básico para representar una lista de elementos.
  • necesita un DependencyProperty personalizado en su control que represente la cadena delimitada.
  • cuando la propiedad de cadena cambia, debe analizarla y reemplazar la lista de elementos en el control.
  • Cuando la propiedad de la lista cambia, debe reemplazar la propiedad de cadena con una lista delimitada adecuadamente.

En términos de código subyacente, esa parte debería ser bastante simple. Entonces, para la plantilla XAML ...

  • necesita una plantilla base que muestra su propiedad Items como una lista, utilizando el diseño WrapPanel mencionado anteriormente.
  • necesita un disparador que reemplace esta plantilla cuando el control tiene foco.
  • la plantilla de reemplazo debe ser TextBox que está vinculada a la propiedad de cadena del control.
  • el comportamiento de enlace predeterminado en un TextBox solo presionará un nuevo valor cuando el TextBox pierde el foco, por lo que debe pensar si desea hacer, por ejemplo, un movimiento de tecla "Enter" (por tanto, revertir la plantilla al lista de la versión: cuando el valor de la propiedad de cadena cambia, su código detrás actualizará la lista).

Esto debería darle el comportamiento básico. Debería poder vincular la propiedad o de la lista con la propiedad de cadena desde fuera del control, aunque debe tener cuidado con lo que sucede si vincula ambas propiedades, ya que existe una dependencia bidireccional entre ellas ...

Cuestiones relacionadas