RichTextBlock无法显示文本中的多个空格问题求助
问题描述
我尝试在RichTextBlock中展示表格数据,这些数据包含多行带有多个空格的文本,我将每行文本以Run对象的形式添加到Paragraph中,代码如下:
string[] lines = tableData; Paragraph para = this.TextContent.Blocks.First() as Paragraph; para.Inlines.Add(new LineBreak()); para.Inlines.Add(new LineBreak()); para.Inlines.Add(new LineBreak()); para.Inlines.Add(new LineBreak()); for (int l = 0; l < lines.Length; l++) { Run r = new Run() { Text = lines[l], FontSize = 9, }; para.Inlines.Add(r); para.Inlines.Add(new LineBreak()); }
但RichTextBlock会将多个空格替换为单个空格,实际显示效果与Notepad中显示的原始文本不符。我未找到Paragraph或Run类中可解决该问题的属性,请问如何让RichTextBlock实现Notepad中的预期显示效果?
解决方案
RichTextBlock默认会合并连续空格,要保留原始空格格式,有两种可行方案:
方案一:使用Span替代Run,设置XmlSpace="preserve"
把原来的Run换成Span,通过XmlSpace属性强制保留文本中的所有空格、换行格式,和纯文本编辑器表现一致。修改后的循环代码如下:
for (int l = 0; l < lines.Length; l++) { Span span = new Span() { XmlSpace = XmlSpace.Preserve, FontSize = 9 }; span.Inlines.Add(new Run { Text = lines[l] }); para.Inlines.Add(span); para.Inlines.Add(new LineBreak()); }
方案二:将普通空格替换为非断行空格(\u00A0)
如果不想修改控件类型,可把文本中的普通空格替换为非断行空格,这种空格不会被RichTextBlock合并:
Run r = new Run() { Text = lines[l].Replace(" ", "\u00A0"), FontSize = 9, };
注意:该方式会替换所有空格,若文本存在自动换行需求,可能影响换行逻辑,更适合纯固定格式的表格数据。
额外提示
如果表格数据有严格列对齐需求,也可以用FixedPage配合多个TextBlock模拟表格,或直接使用DataGrid控件,这类控件对固定格式文本的支持更友好。
内容的提问来源于stack exchange,提问作者Krishna Katamneni
相关产品推荐
相关产品推荐

