2010-02-18 3 views
1

Je dois afficher les éléments suivants à l'aide de la liaison de données WPF (les valeurs changent). Les en-têtes doivent être en gras, les lignes d'information sont du texte normal. Si l'information pour un en-tête donné n'existe pas, je veux réduire cette section, y compris l'en-tête. Je préfère que toutes les données (en-tête et éléments d'information) soient dans une chaîne formatée qui peut interrompre la ligne où je veux.WPF Afficher un texte multiligne formaté à l'aide de la liaison de données

Header1:

Mes infos 1

Mes infos 2

Header2:

Mes infos 3

Mes infos 4

Répondre

0

Si vous voulez faire le bolding dans un style, je pense que votre meilleur pari serait de casser votre chaîne et utiliser TextBlocks dans un StackPanel dans un Expander.

Vous pouvez également le faire dans un RichTextBox avec toute votre chaîne, mais je pense que votre chaîne doit contenir les balises <bold></bold>.

4

Encore une approche à essayer. Utilisez TextBlock.Inlines. Ensuite, liez votre modèle au TextBlock et, soit dans la propriété personnalisée value converter, soit via une propriété jointe personnalisée, analysez votre modèle pour remplir les inlines de TextBlock.

Voici un exemple de la propriété Attached qui prend chaîne de texte et fait chaque deuxième mot gras:

public class RunExtender : DependencyObject 
{ 
    public static string GetText(DependencyObject obj) 
    { 
     return (string)obj.GetValue(TextProperty); 
    } 

    public static void SetText(DependencyObject obj, string value) 
    { 
     obj.SetValue(TextProperty, value); 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached("Text", typeof(string), typeof(RunExtender), new PropertyMetadata(string.Empty, OnBindingTextChanged)); 

    private static void OnBindingTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var bindingText = e.NewValue as string; 
     var text = d as TextBlock; 
     if (text != null) 
     { 
      text.Inlines.Clear(); 
      var words = bindingText.Split(' '); 
      for (int i = 0; i < words.Length; i++) 
      { 
       var word = words[i]; 
       var inline = new Run() {Text = word + ' '}; 
       if (i%2 == 0) 
       { 
        inline.FontWeight = FontWeights.Bold; 
       } 
       text.Inlines.Add(inline); 
      } 
     } 
    } 
} 

Ce n'est pas un code de qualité de la production, et il est pris de Silverlight démo, mais vous voyez l'idée.

Espérons que cela aide.

Cheers, Anvaka.

Questions connexes