2010-05-10 17 views
7

Sto cercando di creare un controllo casella di testo WPF che funzioni in modo simile alle caselle di testo del destinatario della posta elettronica in Outlook (gli ingressi A, Cc e Ccn). Non mi interessa molto di auto-completamento (ho trovato milioni di esempi per questo), ma quello che sto davvero cercando è come avere le voci delimitate del testo nella casella di testo si comportano come entità come fanno in Outlook (una volta che un destinatario che hai inserito si risolve, quel testo diventa una 'entità' che puoi cliccare per selezionare, fare clic con il tasto destro per ottenere un menu contestuale, ecc. Non è più 'testo normale' in cui puoi posizionare il cursore) ...Creazione di un controllo casella di testo WPF come casella di testo destinatario email di Outlook

Qualcuno ha idee di alto livello su come realizzare questo? Conoscere eventuali esempi esistenti (ho cercato su google per ore)?

Grazie mille in anticipo,

Michael.

+0

Forse questo articolo può aiutarti: [Introduzione a TagBox] (http://www.thesilvermethod.com/Default.aspx?Id=IntroducingTagBox) – xVir

+0

http://blog.pixelingene.com/2010/10/tokenizing- control-convert-text-to-token/ - Dai un'occhiata a questo controllo – Sahadevan

risposta

5

Il mio processo di pensiero approssimativo sarebbe questo ... (nota: in realtà non lo sto codificando, quindi i miei dettagli potrebbero essere un po 'spenti ...).

comportamento di alto livello:

  • il tipo di dati nel vostro controllo è un elenco di elementi che non sono selezionabili. Quindi il vostro controllo è, approssimativamente, un ItemsControl (in termini di visualizzazione/XAML, è un ItemsControl con un layout di stile WrapPanel e molto semplice TextBlock per il modello di articolo).
  • quando i vostri guadagni controllo del fuoco, è necessario passare il modello per essere un TextBox
  • quando il controllo perde lo stato attivo, è necessario dividere il testo immesso e convertirlo in un elenco per la visualizzazione.

Pertanto, il codice a pensare:

  • avete bisogno di un UserControl, forse derivato da ItemsControl. Questo ti dà il comportamento di base per rappresentare un elenco di elementi.
  • è necessario un DependencyProperty personalizzato sul controllo che rappresenta la stringa delimitata.
  • quando la proprietà della stringa cambia, è necessario analizzarla e sostituire l'elenco di elementi nel controllo.
  • quando la proprietà dell'elenco cambia, è necessario sostituire la proprietà stringa con un elenco delimitato in modo appropriato.

In termini di code-behind, quella parte dovrebbe essere piuttosto semplice. Poi, per il modello di XAML ...

  • avete bisogno di un modello di base che consente di visualizzare la vostra proprietà Items come una lista, utilizzando il layout WrapPanel di cui sopra.
  • è necessario un trigger che sostituisca questo modello quando il controllo è attivo.
  • il modello di sostituzione deve essere un TextBox associato alla proprietà stringa del controllo.
  • il comportamento di associazione predefinito su un TextBox sposterà un nuovo valore quando lo perde lo stato attivo, quindi è necessario pensare a se si desidera eseguire, ad esempio, un "Invio" spostamento del tasto di spostamento (quindi ripristinare il modello per lista versione - quando il valore della proprietà della stringa cambia, il codebehind aggiornerà la lista).

Questo dovrebbe darvi il comportamento di base. Dovresti essere in grado di associare la proprietà elenco o alla proprietà stringa dall'esterno del controllo, sebbene sia necessario prestare attenzione a ciò che accade se si associano entrambe le proprietà poiché esiste una dipendenza bidirezionale tra di loro ...

Problemi correlati