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

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

Заголовок1:

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

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

Заголовок2:

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

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


person Gord    schedule 18.02.2010    source источник


Ответы (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, но вы поняли идею.

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

Привет, Анвака.

person Anvaka    schedule 18.02.2010

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

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

person Seth Moore    schedule 18.02.2010