3

正如您从 stackoverflow post中看到的那样,当ListBox的大小变小时,此代码不会修剪TextBlock的文本。

 <ListBox ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ListBox显示HorizontalScrollBar- 换句话说,TextBlock的空间足够大,不需要进行文本修剪。这可以使用下一行代码来解决:

<ListBox ...
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ... />

所以现在文本将被修剪。但是,如果我不想修剪整个文本直到唯一的……会留下来?比方说,我已经设置了MinWidthTextBlock属性,当ListBox的宽度变得小于那个MinWidth时,我想要HorizontalScrollBar变得可见。

我试图处理SizeChanged事件,并根据条件设置ScrollViewer.HorizontalScrollBarVisibility附加属性。但是,当我将后者从更改为时,文本并没有被修剪Disabled——Visible所以它以某种方式跳跃——从修剪到完整,这不是最佳的 UI 实践。

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

4

1 回答 1

5

WPF 中的TextBlockWPF 真的不想修剪它的文本。当没有足够的空间时它会这样做,但是一旦ScrollViewer可以滚动,TextBlock它就会认为它有无限的可用空间,所以它不会修剪。

我认为最简单的方法是将MaxWidthon设置TextBlockActualWidthof ListBox

<DataTemplate>
    <TextBlock Text="{Binding}" 
               TextTrimming="CharacterEllipsis"
               MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>
</DataTemplate>

ListBox Style对于默认的 WPF (这会导致滚动条仍然出现),这将稍微太大。我会编写一个自定义转换器从这个值中减去大约 8:

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>

作为奖励,如果您设置ListBox.MinWidth,您将不必启用/禁用水平滚动条。

于 2013-07-02T19:05:41.230 回答