wpf 设定文字样式

使用inline属性

后台:

public static string GetInlineText(DependencyObject obj)

    {

        return (string)obj.GetValue(InlineTextProperty);

    }

    public static void SetInlineText(DependencyObject obj, string value)

    {

        obj.SetValue(InlineTextProperty, value);

    }

    public static readonly DependencyProperty InlineTextProperty = DependencyProperty.RegisterAttached(

        "InlineText"

        typeof(string), 

        typeof(InlineTextBehaviour), 

        new PropertyMetadata(null, InlineTextChanged)

        );

    static void InlineTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)

    {

        var textBlock = sender as TextBlock;

        if (textBlock != null)

        {

            textBlock.Inlines.Clear();

            textBlock.Inlines.Add(FormatText(e.NewValue as string ?? ""));

        }

    }

    static Dictionary<string, Func<string, Run>> keywords = new Dictionary<string, Func<string, Run>>()

    {

        {"你好", s => new Run(s){Foreground = Brushes.Red}},

        {"朋友", s => new Run(s){Foreground = Brushes.Blue, FontSize = 28}},

    };

    static Inline FormatText(string text)

    {

        Span span = new Span();

        int startIndex = 0;

        while (true)

        {

            var hit = keywords.Keys.Select(k => new { word = k, index = text.IndexOf(k, startIndex) }).OrderBy(x => (uint)x.index).FirstOrDefault();

            if(hit.index < 0)

            {

                span.Inlines.Add(new Run(text.Substring(startIndex)));

                break;

            }

            span.Inlines.Add(new Run(text.Substring(startIndex, hit.index - startIndex)));

            span.Inlines.Add(keywords[hit.word](hit.word));

            startIndex = hit.index + hit.word.Length;

        }

        return span;

    }

前台: 

<TextBlock loc:InlineTextBehaviour.InlineText="你好,1111朋友" />

猜你喜欢

转载自blog.csdn.net/lai124793549/article/details/81235746