2009-03-31 8 views
5

J'utilise le modèle MVVM et j'ai la propriété de type chaîne dans mon ModelView.WPF TextBlock dynamique gras et italique parties

La chaîne peut contenir des balises HTML suivantes:

<b>, </b>, <i>, </i> 

je dois faire certaines parties du texte TextBlock être en état normal, en gras ou en italique.

Au moment où j'ai créé contourner ce problème, une méthode d'assistance qui fonctionne comme ceci:

  1. Pauses chaîne HTML en parties

  2. Crée une nouvelle instance de Run classe

  3. Selon étiquette, définit les propriétés FontWeight ou FontStyle

  4. Ajoute une instance de Run class à InBox de TextBlock s collection

Cette solution fonctionne, mais elle n'est pas compatible avec le modèle MVVM.

Je pensais utiliser des Convertisseurs, mais je ne suis pas sûr de savoir à quelle propriété de TextBlock je devrais me lier.

Que pensez-vous, comment ce problème peut-il être résolu?

Répondre

1

La solution la plus simple que j'ai trouvée pour ce problème.

est d'utiliser BindableRichTextBox, qui peut être trouvé à http://www.shawnduggan.com/?p=54

  1. En utilisant Convertors convertir la chaîne HTML pour XAML, puis en faire l'objet FlowDocument

  2. Bind Document à BindableRichTextBox

  3. Faire RichTextBox ressembler à TextBlock (Focusable = "Faux", BorderThinkness = "0", BorderBrush = "Blanc" .... etc)

4

Quelque chose que j'ai fait dans le passé est d'utiliser un ContentControl, avec la propriété Content liée à la chaîne avec un ValueConverter qui retourne un TextBlock créé dynamiquement. D'autres solutions peuvent être trouvées ici, y compris this one.

+0

Essayez ContentControl et BindableRun. Je vous remercie! –

+0

Excellente solution! Bon, d'accord, je préférerais pouvoir lier la propriété 'Inlines', mais en l'absence d'un tel support, c'est une très bonne alternative. Il est également intéressant de noter que la propriété 'Text' de' Run' est maintenant une propriété de dépendance, donc peut être lié sans avoir besoin de BindableRun. –

Questions connexes