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>
теги.