2010-05-23 63 views
4

我在我的主窗体中有TextBlock。在应用程序运行期间,我将Text属性设置为不同的字符串。我可以动态地将TextBlock.Text的一部分变成不同的颜色吗?

我想能够给特定字符串的部分着色。

伪代码:

if(a < 0) txbStatus.Text = string.Format("{0} <RED>{1}</RED>", a, b); 
    else txbStatus.Text = string.Format("{0} <BLUE>{1}</RED>", a, b); 
+0

难道你还http://stackoverflow.com/a/1926822/198348使用RichTextBlock,什么样的? – 2012-07-11 16:12:11

回答

11

您可以分割您的字符串的方式你想然后使用foreach()循环为该拆分字符串尝试

TextBlockName.Inlines.Add(new Run("colored text") {Foreground = Brushes.Blue}); 
+1

完美地工作。谢谢 ! (虽然有一个额外的支架) – 2010-05-23 18:43:53

+0

糟糕的是,额外的支架.... – Johnny 2010-05-24 06:14:00

+0

现在删除额外的支架 – 2015-04-01 18:03:18

5

一个TextBox的内容并不一定只是一个字符串,但Inline个集合:

txbStatus.Inlines.Clear(); 
txbStatus.Inlines.Add(new Run("normal color, ")); 
txbStatus.Inlines.Add(new Run("colored text") { Foreground = Brushes.Red }); 
3

我已经创建了一个自定义的TextBlock,它将帮助您突出显示TextBlock的“文本”值内的部分文本。

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Documents; 

    namespace UI.WPF.UserControls 
    { 
     class CustomTextBlock:TextBlock 
     { 
      string _originalText; 

      public string HighlighText 
      { 
       get { return (string)GetValue(HighlighTextProperty); } 
       set 
       { 
        SetValue(HighlighTextProperty, value); 

        RenderHighlightedText(); 
       } 
      } 

      // Using a DependencyProperty as the backing store for HighlighText. This enables animation, styling, binding, etc... 
      public static readonly DependencyProperty HighlighTextProperty = 
       DependencyProperty.Register("HighlighText", typeof(string), typeof(CustomTextBlock), 
        new FrameworkPropertyMetadata(new PropertyChangedCallback(HighlighTextProperty_Changed)) 
        ); 

      private static void HighlighTextProperty_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) 
      { 
       CustomTextBlock textBlock = (CustomTextBlock)d; 
       textBlock.RenderHighlightedText(); 
      } 


      public CustomTextBlock() 
       : base() 
      { 

      } 

      static CustomTextBlock() 
      { 
       DefaultStyleKeyProperty.OverrideMetadata(
        typeof(CustomTextBlock), 
        new FrameworkPropertyMetadata(typeof(CustomTextBlock))); 
      } 

      public override void OnApplyTemplate() 
      { 

       base.OnApplyTemplate(); 
      } 

      protected override void OnInitialized(EventArgs e) 
      { 
       base.OnInitialized(e); 
       _originalText = Text; 

       RenderHighlightedText(); 
      } 


      private Run GetFormatedText(string text, bool isBold) 
      { 
       Run noramlRun = new Run(text); 
       if (isBold) 
       { 
        noramlRun.FontWeight = FontWeights.Bold; 
       } 
       else 
       { 
        noramlRun.FontWeight = FontWeights.Normal; 
       } 

       return noramlRun; 
      } 
      public void RenderHighlightedText() 
      { 
       var boldText = HighlighText; 

       if (!string.IsNullOrEmpty(HighlighText) && 
        _originalText.ToLower().Contains(boldText.ToLower())) 
       { 

        this.Inlines.Clear(); 

        int point = _originalText.ToLower().IndexOf(boldText.ToLower()); 
        string strHighlighted = _originalText.Substring(point, HighlighText.Length); 

        Run runHighlight = GetFormatedText(strHighlighted, true); 

        if (point == 0) 
        { 
         this.Inlines.Add(runHighlight); 
         int remainingLength = _originalText.Length - (point + HighlighText.Length); 

         string remaingText = _originalText.Substring((point + HighlighText.Length), remainingLength); 
         this.Inlines.Add(GetFormatedText(remaingText, false)); 
        } 
        else 
        { 
         string firstPart = _originalText.Substring(0, point); 
         this.Inlines.Add(GetFormatedText(firstPart, false)); 
         this.Inlines.Add(runHighlight); 
         int remainingLength = _originalText.Length - (point + HighlighText.Length); 
         string remaingText = _originalText.Substring((point + HighlighText.Length), remainingLength); 
         this.Inlines.Add(GetFormatedText(remaingText, false)); 

        } 

       } 
       else 
       { 

        this.Inlines.Clear(); 


        this.Inlines.Add(GetFormatedText(_originalText, false)); 
       } 

      } 
     } 
    } 

使用它的方式。

   <usercontrol:CustomTextBlock Text="{Binding Title}" 
            HighlighText="{Binding DataContext.SearchText, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" 

            /> 

欲了解更多信息

https://sites.google.com/site/greateindiaclub/mobil-apps/windows8/highlightpartoftextinwpftextblockcontrol

相关问题