正如您所看到的from stackoverflow post,当 ListBox 的大小变小时,此代码不会修剪 TextBlock 的文本。< / p>
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ListBox 显示HorizontalScrollBar
- 换句话说, TextBlock 的空间足够大,无需文本修剪。这可以使用下一行代码来解决:
<ListBox ...
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
... />
所以现在文本将被修剪。但是,如果我不想修改整个文本,直到唯一 ... 留下来?比方说,我设置了 TextBlock 属性的MinWidth
,当 ListBox 的宽度小于MinWidth
时,我想要HorizontalScrollBar
因为可见。
我尝试处理SizeChanged
事件,并根据条件设置ScrollViewer.HorizontalScrollBarVisibility
附加属性。但是当我将后者从Disabled
更改为Visible
时,文本就不会被修剪 - 所以它会以某种方式跳转 - 从修剪到完全,这不是最好的UI练习。
问:那么,如何实现上述行为?
答案 0 :(得分:5)
WPF中的TextBlock
确实不会希望修剪其文本。当没有足够的空间时它会这样做,但只要ScrollViewer
可以滚动,TextBlock
认为它有无限的可用空间,所以它不会修剪。
我认为最简单的方法是将MaxWidth
上的TextBlock
设置为ActualWidth
的{{1}}:
ListBox
对于默认的WPF <DataTemplate>
<TextBlock Text="{Binding}"
TextTrimming="CharacterEllipsis"
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>
</DataTemplate>
ListBox
(这会导致滚动条仍然出现),这将会略微过大。我会写一个自定义转换器从这个值中减去大约8:
Style
然后用它来转换public FudgeFactorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return Binding.DoNothing;
return (double)value - 8; // you will probably need to tweak this
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
:
MaxWidth
作为奖励,如果您设置<DataTemplate>
<DataTemplate.Resources>
<my:FudgeFactorConverter x:Key="fudgeFactorConverter" />
</DataTemplate.Resources>
<TextBlock Text="{Binding}"
TextTrimming="CharacterEllipsis"
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Converter={StaticResource fudgeFactorConverter}}"/>
</DataTemplate>
,则无需启用/禁用水平滚动条。