xaml TextBlock 以部分粗体显示文本

xaml TextBlock to show text with partial bold font

我将从我的数据库中获取一个字符串并将其中的一部分(例如匹配关键字)设置为粗体。然后在 TextBlock 上显示它。 例如。 “嗨,谁是 Tom?我需要找到他。”

我指的是这个link: https://social.msdn.microsoft.com/Forums/en-US/bb1f558c-a2dd-4977-85d7-8e0ce9631681/how-to-make-part-of-a-string-bold-in-c?forum=aspgettingstarted 将匹配的词翻译成粗体:

private string FormatString(string wholeString, string boldPart)
{
    return Regex.Replace(wholeString, boldPart, @"<b>[=11=]</b>", RegexOptions.IgnoreCase);
}

然后我得到这个格式化的新字符串“嗨,Tom 是谁?我需要找到他。”

但是在我将其放入 TextBlock 的文本 属性 后,我得到了如下所示的一些错误。

您可以将文本拆分为多个 Run 并使用 FontWeight 作为粗体文本。

<TextBlock>
    <Run Text="Who is "/>
    <Run FontWeight="Bold" Text="Tom"/>
    <Run Text="? I need to find him!"/>
</TextBlock>

<TextBlock>Who is <Bold>Tom</Bold>? I need to find him!</TextBlock>

已编辑: 为了能够在单个 TextBlock 中添加不同的格式,我认为您可以订阅 TextBlockTargetUpdated 事件并为每个字符串添加 Run class <b></b>

TargetUpdated 事件的示例:

        private void MyText_TargetUpdated(object sender, DataTransferEventArgs e)
        {
            string text = myText.Text;

            if (text.Contains("<b>") && text.Contains("</b>"))
            {
                int nrOfB = text.Split("<b>", StringSplitOptions.None).Length - 1;
                myText.Text = "";
                string textAfter ="";
                for (int i = 0; i < nrOfB; i++)
                {
                    int startIndex = text.IndexOf("<b>");
                    int endIndex = text.IndexOf("</b>");
                    string textBefore = text.Substring(0, startIndex);
                    string textBolded = text.Substring(startIndex + 3, endIndex - (startIndex + 3));
                    textAfter = text.Substring(endIndex + 4);
                    Debug.WriteLine($"Text Before: {textBefore},\nTextBolded: {textBolded},\nTextAfter: {textAfter}");
                    myText.Inlines.Add(new Run(textBefore));
                    myText.Inlines.Add(new Bold(new Run(textBolded)));
                    text = textAfter;
                }
                myText.Inlines.Add(new Run(textAfter));

            }
        }

和xaml控件将是:

 <UserControl.Resources>
        <Style TargetType="local:Test"> 
            <Setter Property="MyText" Value="{Binding MyTextVM, Mode=TwoWay}"/>
        </Style>
    </UserControl.Resources>

<TextBlock x:Name="myText" Text="{Binding ElementName=TestV, Path=MyText, Mode=OneWay, NotifyOnTargetUpdated=True}" TargetUpdated="MyText_TargetUpdated"/>
local:Test - my View,
TestV - Name for the view,
MyText - DependencyProperty of my custom TextBlock class,
MyTextVM - property from ViewModel

此字符串:My Text is a <b>Bold</b> text. <b>Second</b> text bold is <b>Bolded</b> too. 将创建此视觉效果: