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

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

Заголовок1:

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

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

Заголовок2:

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

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

Ответы [ 2 ]

4 голосов
/ 18 февраля 2010

Еще один подход, чтобы попробовать. Используйте 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, но вы поняли.

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

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

0 голосов
/ 18 февраля 2010

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

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

...