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
中添加不同的格式,我认为您可以订阅 TextBlock
的 TargetUpdated
事件并为每个字符串添加 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.
将创建此视觉效果:
我将从我的数据库中获取一个字符串并将其中的一部分(例如匹配关键字)设置为粗体。然后在 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
中添加不同的格式,我认为您可以订阅 TextBlock
的 TargetUpdated
事件并为每个字符串添加 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.
将创建此视觉效果: