TextBox中的文本未在ListBox内正确修剪

时间:2013-07-02 18:34:34

标签: wpf listbox scrollviewer textblock texttrimming

正如您所看到的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练习。

:那么,如何实现上述行为?

1 个答案:

答案 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> ,则无需启用/禁用水平滚动条。

相关问题