2012-12-27 58 views
5

我想使文本塊的文本成爲粗體的一部分。這是我在IValueConverter中嘗試的,但它似乎不起作用。使用iValueConverter格式化TextBlock文本的一部分

public class Highlighter : IValueConverter 
    { 


     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value == null) 
      { 
       return null; 
      } 

      return "Question1:<Bold>Answer1</Bold>, Question2:<Bold>Answer2</Bold>, Question3:<Bold>Answer3</Bold>"; 

     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

此不作應答大膽。

這就是我在XAML中使用它的方式。

<TextBlock Height="Auto" Width="Auto" MaxHeight="64" Text="{Binding Path=QuestionAnswer, Mode=OneWay, Converter={x:Static Highlighter}}" /> 

有沒有辦法通過格式化文本或發送TextBlock到轉換器?

+0

TextBlock的不支持富文本,所以如果你想樣式應用到文字或你將不得不分解運行中的文本(如Chris所示)或使用支持富文本的控件。 – Ucodia

回答

12

這是絕對有可能與TextBlock控制的事,但考慮到所有你可能想切換到其它控制(ItemsControl爲例)的努力。

無論如何,這裏是一個解決方案。實際上,有幾個問題需要解決:

  1. TextBlock.Text屬性爲string,你不能預先格式化的文本分配給它
  2. TextBlock.Inlines可以接受格式化文本,但它是隻讀屬性
  3. 你」 (可能有簡單的方法來解析帶標籤的文本並生成格式化輸出作爲Inline對象的集合,但我不知道任何)

您可以創建附加屬性y以對付前2個問題:

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}}" /> 

請注意,你需要映射你在哪裏TextBlockEx是在XAML 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; 
} 
2

雅,這樣的事情應該把雅放在軌道上;

<TextBlock> 
    <Run Text="Question/Binding/Whatever..."/> 
    <Run Text="Answer/Binding/Whatever..." FontWeight="Bold"/> 
</TextBlock> 
+0

我不能使用這個,因爲可能有n個問題。 – Asdfg

+0

爲什麼不呢?使它成爲一個ContentControl,將它放在ItemsControl或ListBox中,然後瞧! –