简体   繁体   中英

Can I dynamically make part of the TextBlock.Text to different colour?

I have TextBlock in my main form. I set the Text property to different strings during the application run.

I would like to be able to colour parts of particular strings.

Pseudo code:

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

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

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

The content of a TextBox doesn't have to be just a string, but a collection of Inline s:

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

I have created a custom TextBlock which will help you to highlight some part of text within the TextBlock's "Text" value.

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

            }
        }
    }

The Way to use it.

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

                                   />

For more information

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM