绝对有可能与TextBlock
控制有关,但考虑到您可能想要切换到其他控制(ItemsControl
例如)的所有努力。
无论如何,这是一个解决方案。实际上有几个问题需要解决:
TextBlock.Text
属性是string
,并且您不能将预格式化的文本分配给它
TextBlock.Inlines
可以接受格式化文本,但它是只读属性
- 您必须自己格式化文本(可能有简单的方法来解析带有标签的文本并将格式化的输出生成为
Inline
对象的集合,但我不知道)
您可以创建一个附加属性来处理前两个问题:
public static class TextBlockEx
{
public static Inline GetFormattedText(DependencyObject obj)
{
return (Inline)obj.GetValue(FormattedTextProperty);
}
public static void SetFormattedText(DependencyObject obj, Inline value)
{
obj.SetValue(FormattedTextProperty, value);
}
public static readonly DependencyProperty FormattedTextProperty =
DependencyProperty.RegisterAttached(
"FormattedText",
typeof(Inline),
typeof(TextBlockEx),
new PropertyMetadata(null, OnFormattedTextChanged));
private static void OnFormattedTextChanged(
DependencyObject o,
DependencyPropertyChangedEventArgs e)
{
var textBlock = o as TextBlock;
if(textBlock == null) return;
var inline = (Inline)e.NewValue;
textBlock.Inlines.Clear();
if(inline != null)
{
textBlock.Inlines.Add(inline);
}
}
}
XAML 会改变一点:
<TextBlock local:TextBlockEx.FormattedText="{Binding Path=QuestionAnswer,
Mode=OneWay,
Converter={x:Static Highlighter}}" />
请注意,您需要将命名空间映射到 XAMLTextBlockEx
中声明的位置。xmlns:local="clr-namepace:<namespace_name>"
现在您需要在转换器中构造格式化文本而不是纯文本来解决最后一个问题:
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
if(value == null)
{
return null;
}
var span = new Span();
span.Inlines.Add(new Run("Question1: "));
span.Inlines.Add(new Run("Answer1") { FontWeight = FontWeights.Bold });
span.Inlines.Add(new Run(", "));
span.Inlines.Add(new Run("Question2: "));
span.Inlines.Add(new Run("Answer2") { FontWeight = FontWeights.Bold });
span.Inlines.Add(new Run(", "));
span.Inlines.Add(new Run("Question3: "));
span.Inlines.Add(new Run("Answer3") { FontWeight = FontWeights.Bold });
return span;
}