我可以动态地将TextBlock.Text的一部分制作成不同的颜色吗?

时间:2010-05-23 12:37:03

标签: c# wpf

我的主窗体中有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);

3 个答案:

答案 0 :(得分:11)

您可以按照您想要的方式拆分字符串,然后使用foreach()循环进行拆分字符串尝试

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

我创建了一个自定义TextBlock,它可以帮助您突出显示TextBlock的“Text”值中的部分文本。

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