WPF Display formatted multiline text using data binding

后端 未结 2 1367
北海茫月
北海茫月 2021-01-15 23:19

I need to display the following using WPF databinding (the values change). Headers must be bold, the info lines are normal text. If info for a given header does not exist, I

相关标签:
2条回答
  • 2021-01-15 23:44

    If you want to do the bolding in a style I think your best bet would be to break your string up and use TextBlocks within a StackPanel within an Expander.

    Alternatively you could do it in a RichTextBox with your whole string, but I think your string would have to contain the <bold></bold> tags.

    0 讨论(0)
  • 2021-01-16 00:01

    One more approach to try. Use TextBlock.Inlines. Then bind your model to the TextBlock, and either in custom value converter or via custom attached property parse your model to populate TextBlock's inlines.

    Here is an example of Attached property that takes Text string and makes every second word bold:

    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);
                }
            }
        }
    }
    

    This is not a production quality code, and it's taken from Silverlight demo, but you get the idea.

    Hope this helps.

    Cheers, Anvaka.

    0 讨论(0)
提交回复
热议问题