Wpf 文本块中的文本未在列表框中正确修剪
如您所见,当列表框的大小变小时,此代码不会修剪文本块的文本Wpf 文本块中的文本未在列表框中正确修剪,wpf,listbox,scrollviewer,textblock,texttrimming,Wpf,Listbox,Scrollviewer,Textblock,Texttrimming,如您所见,当列表框的大小变小时,此代码不会修剪文本块的文本 <ListBox ItemsSource="{Binding}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/> </DataTemplate> &l
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
现在文本将被修剪。但是如果我不想把整个文本删减到只剩下。的部分?比方说,我已经设置了TextBlock属性的MinWidth
,当列表框的宽度小于MinWidth
时,我希望水平滚动条
可见
我已尝试处理SizeChanged
事件,并根据条件设置ScrollViewer.HorizontalScrollBarVisibility
attached属性。但是当我将后者从禁用
更改为可见
时,文本不会被修剪,因此它会以某种方式从修剪到完整,这不是最佳的UI实践
Q:那么,如何实现上述行为呢?WPF中的
TextBlock
确实不想修剪文本。当没有足够的空间时,它会这样做,但是只要ScrollViewer
可以滚动,TextBlock
就会认为它有无限的可用空间,因此它不会进行修剪
我认为最简单的方法是将TextBlock
上的MaxWidth
设置为列表框的ActualWidth
:
<DataTemplate>
<TextBlock Text="{Binding}"
TextTrimming="CharacterEllipsis"
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>
</DataTemplate>
然后使用它转换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>
作为奖励,如果您设置了ListBox.MinWidth
,则不必启用/禁用水平滚动条。这真是我想要的!但我不知道8号应该负责什么?这是边距、边界厚度或其他任何因素的总和吗?我认为正确解决方案的关键是正确计算福吉术语。是的,它是ListBox
的BorderThickness
和ListBoxItem
上的填充的组合。您可能可以将其改进为绑定到ScrollContentPresenter
,这样就不需要考虑边界厚度
。它仅在未调整窗口大小时才起作用。否则它只会增长而不会收缩。
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;
}
}
<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>