WPF 中的多行填充文本

Multi-line padded text in WPF

我正在尝试在 WPF 中实现矩形阴影效果,如下所示: https://css-tricks.com/multi-line-padded-text/

阴影应该跟在每行文本之后,但行与行之间不应有 space。此外,阴影将具有一定的透明度,这排除了为内联 运行s 添加单独的背景。我试过了,阴影与不透明度值重叠的地方形成了较深的颜色。

到目前为止,我已经调查了 TextBox、TextBlock 和 RichTextBox。我尝试更改 Run.Background,或选择文本并更改选择 foreground/background。没有成功,其中 none 正是我需要的。

基本上(我认为)我需要的是文本格式化功能,它允许我从内存中的字符串创建正确包装的文本,每一行都有单独的 运行s。在此之后,我可以找出每个 运行 的像素长度,将这些 运行 手动添加到 RichTextBox 或 TextBlock,并在它们后面手动创建矩形。 不幸的是,当我将文本添加到 TextBlock 或 RichTextBox 时,换行应用于 运行 本身,而不是为每个换行创建单独的 运行s。

我还没有收到任何回复,所以我正在尝试回答我自己的问题。 我对 TextBlock 的主要问题是,如果我向内联 运行 对象添加稍微透明的背景颜色,它们会在线条稍微重叠时形成较暗的颜色。为了克服这个问题,我将 运行 背景更改为不透明,这样 100% 的不透明度值就不会导致明显的重叠线。然后我将整个 TextBlock 的不透明度更改为 80% - 我得到了预期的结果。

这是一个示例 xaml:

<TextBlock TextWrapping="Wrap" FontWeight="SemiBold" FontSize="23" FontFamily="Arial" TextBlock.LineHeight="24.65" 
            TextOptions.TextFormattingMode="Ideal"  TextTrimming="CharacterEllipsis" LineStackingStrategy="BlockLineHeight"  Opacity="0.8">
    <Run Background="#FFFF0000" Text="This text here" />
    <Run Background="#FFFF0000" Text="will be visible across" />
    <Run Background="#FFFF0000" Text="multiple lines" />
</TextBlock>

请注意,LineHeight 值略高于 FontSize 值。这样可以确保线条之间没有可见的间隙。