WPF Отображение форматированного многострочного текста с использованием привязки данных

Мне нужно отобразить следующее с помощью привязки данных WPF (значения меняются). Заголовки должны быть выделены жирным шрифтом, информационные строки - это обычный текст. Если информация для данного заголовка не существует, я хочу свернуть этот раздел, включая заголовок. Я предпочитаю, чтобы все данные (заголовок и информационные элементы) были в одной отформатированной строке, которая может разрывать строки, где я хочу.

Header1:

Моя информация 1

Моя информация 2

Заголовок 2 :

Моя информация 3

Моя информация 4

2 ответа

Еще один подход, чтобы попробовать. Используйте TextBlock.Inlines. Затем привяжите вашу модель к TextBlock, и либо в пользовательском конвертере значений, либо через пользовательское присоединенное свойство проанализируйте вашу модель, чтобы заполнить строки TextBlock.

Вот пример свойства Attached, которое принимает текстовую строку и выделяет каждое второе слово жирным шрифтом:

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

Это не код качества производства, он взят из демонстрации Silverlight, но вы поняли идею.

Надеюсь это поможет.

Ура, Анвака.

Если вы хотите создать стиль, я думаю, что вам лучше всего будет разбить вашу строку и использовать TextBlocks в пределах StackPanel в пределах Expander,

В качестве альтернативы вы можете сделать это в RichTextBox со всей вашей строкой, но я думаю, что ваша строка должна содержать <bold></bold> теги.

Другие вопросы по тегам