WPF C#如何使用Text属性设置文本块中的格式化文本

时间:2018-11-27 22:06:54

标签: c# wpf textblock

我需要将TextBlock代码的文本设置为包含格式化文本的字符串。

例如,以下字符串:

"This is a <Bold>message</Bold> with bold formatted text"

如果我以这种方式将此文本放在xaml文件中,则

<TextBlock>
  This is a <Bold>message</Bold> with bold formatted text
</TextBlock>

但是,如果我使用Text属性设置它,则无效。

string myString = "This is a <Bold>message</Bold> with bold formatted text";
myTextBlock.Text = myString;

我知道我可以使用Inlines:

myTextBlock.Inlines.Add("This is a");
myTextBlock.Inlines.Add(new Run("message") { FontWeight = FontWeights.Bold });
myTextBlock.Inlines.Add("with bold formatted text");

但是问题是我从另一个来源获得了该字符串,而且我不知道如何将该字符串传递给TextBlock并查看其是否格式化。 我希望有一种方法可以直接使用格式化的字符串设置TextBlock的内容,因为我不知道如何解析该字符串以与Inlines一起使用。

2 个答案:

答案 0 :(得分:2)

您可以从字符串中解析TextBlock并返回其内联的集合:

private IEnumerable<Inline> ParseInlines(string text)
{
    var textBlock = (TextBlock)XamlReader.Parse(
        "<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">"
        + text
        + "</TextBlock>");

    return textBlock.Inlines.ToList(); // must be enumerated
}

然后将集合添加到您的TextBlock:

textBlock.Inlines.AddRange(
    ParseInlines("This is a <Bold>message</Bold> with bold formatted text"));

答案 1 :(得分:1)

TextBlock将不直接支持该功能,您将编写一种方法来自行解析字符串并设置内联样式。看起来并不难解​​析。使用正则表达式或令牌解析器。取决于您需要支持多少种样式,但是Regex是更简单的方法。