WPF RichTextBox实现单行显示、溢出加省略号且支持部分文本加粗咨询
方案1(最优推荐):替换为TextBlock控件实现
你当前仅需要展示带部分加粗的文本、不需要编辑功能,完全可以放弃较重的RichTextBox,改用原生支持文本截断省略的TextBlock实现,开发成本更低性能更好:
- TextBlock本身支持通过
Inlines集合添加不同格式的Run元素,可实现局部加粗效果,同时原生自带溢出省略号能力,只需要在XAML中配置:
<TextBlock TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" MaxWidth="200" <!-- 根据你的布局需求设置最大宽度 --> local:TextBlockInlineBinder.BindableContent="{Binding SearchSuggestionTextWithTag}" />
- 实现一个附加属性类
TextBlockInlineBinder,逻辑和你当前ViewModel中解析<b>标签的逻辑一致,将带标签的文本解析为普通/加粗的Run元素添加到TextBlock的Inlines集合中即可,完全复用你已有的解析逻辑。
方案2:坚持使用RichTextBox的实现方式
如果必须使用RichTextBox,有两种实现思路:
思路A:控件层附加属性实现
先对RichTextBox做单行限制配置:
<RichTextBox IsReadOnly="True" AcceptsReturn="False" TextWrapping="NoWrap" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled" local:RichTextBoxTrimming.EnableTrimming="True" />
然后实现附加属性RichTextBoxTrimming,监听RichTextBox的大小变化、内容变化事件:
- 每次内容或控件宽度变化时,用
FormattedText计算所有Inline的总渲染宽度(需要区分普通文本和加粗文本的宽度差异) - 如果总宽度超出控件可用宽度,从最后一个Inline开始向前逐步删除字符,直到剩余内容宽度 + 省略号宽度 ≤ 可用宽度
- 末尾追加普通样式的
Run元素,内容为...
思路B:ViewModel层预截断
在你当前生成FlowDocument的构造逻辑中新增最大宽度参数,提前做截断计算:
- 新增方法计算单个Run的实际渲染宽度:
private double GetRunWidth(Run run) { var dpi = VisualTreeHelper.GetDpi(Application.Current.MainWindow).PixelsPerDip; var formatted = new FormattedText( run.Text, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface(run.FontFamily, run.FontStyle, run.FontWeight, run.FontStretch), run.FontSize, Brushes.Black, dpi); return formatted.Width; }
- 生成所有Run后累加总宽度,如果超出最大宽度,就从最后一个Run开始逐字符删除,再计算总宽度,直到总宽度 + 省略号宽度 ≤ 最大宽度,最后追加省略号的Run即可。
内容的提问来源于stack exchange,提问作者Umar
相关产品推荐
相关产品推荐

