2012-12-27 14 views
5

का उपयोग कर टेक्स्टब्लॉक के टेक्स्ट का स्वरूप भाग मैं टेक्स्ट टेक्स्ट बोल्ड के टेक्स्ट का हिस्सा बनाना चाहता हूं। मैंने यही किया है कि मैंने IValueConverter में कोशिश की लेकिन यह काम नहीं कर रहा है।iValueConverter

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(); 
     } 
    } 

यह उत्तर बोल्ड नहीं बनाता है।

इस प्रकार मैं इसे एक्सएएमएल में उपयोग कर रहा हूं।

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

क्या कोई तरीका है कि मैं पाठ को स्वरूपित करके या टेक्स्टब्लॉक को कनवर्टर भेजकर प्राप्त कर सकता हूं?

+0

TextBlock रिच टेक्स्ट नहीं का समर्थन करता है है तो आप करना होगा यदि आप या आपका पाठ करने के लिए शैलियों लागू करना चाहते हैं:

अब आप पिछले समस्या को हल करने सादे पाठ के बजाय कनवर्टर में स्वरूपित पाठ का निर्माण करने की जरूरत है अपने पाठ को रनों में विभाजित करें (जैसा कि क्रिस द्वारा दिखाया गया है) या समृद्ध पाठ का समर्थन करने वाले नियंत्रण का उपयोग करें। – 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

मैं इसका उपयोग नहीं कर सकता क्योंकि वहां कई प्रश्न हो सकते हैं। – Asdfg

+0

क्यों नहीं? इसे कंटेंट कंट्रोल बनाएं, इसे किसी आइटम कंट्रोल या लिस्टबॉक्स या कुछ और स्लोला में थप्पड़ मार दें! –