WPF如何让Border内的TextBlock无需硬编码宽度实现TextTrimming=CharacterEllipsis效果
解决方案
你遇到的问题本质是TextBlock没有宽度限制,导致TextTrimming属性无法触发裁剪逻辑,仅需修改3处XAML代码即可实现需求,无需硬编码宽度、无需调整ViewModel逻辑:
- 删除
TextBlock上硬编码的Width="210"属性 - 将
TextBlock的HorizontalAlignment从Left改为Stretch,让它的宽度自动跟随父容器可用宽度变化 - 可选:给外层
Border加Padding属性,避免文字紧贴边框,优化显示效果
修改后的对应代码片段如下:
<Grid Grid.Row="2" HorizontalAlignment="Stretch"> <Border BorderBrush="Red" BorderThickness="1" Visibility="{Binding IsFoundErrorsOnSave, Mode=TwoWay, Converter={StaticResource BoolToVis}}" Padding="4,2"> <TextBlock Foreground="{StaticResource AntiStrongestBrush}" HorizontalAlignment="Stretch" Text="{Binding ErrorsOnSaveMessage}" ToolTip="{Binding ErrorsOnSaveMessage}" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap"/> </Border> </Grid>
原理解释
WPF中TextTrimming生效的前提是TextBlock的内容宽度大于控件自身的实际渲染宽度。你原来的代码中TextBlock设置了HorizontalAlignment="Left",WPF会为其分配刚好能放下所有文本的宽度,没有上限所以不会触发裁剪;改为Stretch后,TextBlock的宽度被限制为父容器Border的可用宽度,文本超过该宽度时就会自动显示省略号,同时Tooltip仍会展示完整的错误信息,完全符合你的需求。
如果存在特殊布局层级导致宽度不生效,可以给TextBlock增加MaxWidth绑定兜底,代码如下:
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Grid, AncestorLevel=1}}"
内容的提问来源于stack exchange,提问作者Boris Kleynbok
相关产品推荐
相关产品推荐

