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

stu*_*bax 3 wpf listbox textblock scrollviewer texttrimming

正如您在stackoverflow帖子中看到的那样,当ListBox的大小变小时,此代码不会修剪TextBlock的文本.

 <ListBox ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

列表框显示了HorizontalScrollBar-换句话说,房间的TextBlock足够大并且在文字修剪没有必要.这可以使用下一行代码解决:

<ListBox ...
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ... />
Run Code Online (Sandbox Code Playgroud)

所以现在文本将被修剪.但是,如果我不想修剪整个文本,直到唯一...会留下来?让说,我设置MinWidth了的TextBlock的财产,并在宽度列表框 becames小于MinWidth,我想HorizontalScrollBarbecames可见.

我试图处理SizeChanged事件,并根据条件设置ScrollViewer.HorizontalScrollBarVisibility附加属性.但是当我将后者Disabled改为时,文本就不会被修剪Visible- 所以它以某种方式跳转 - 从修剪到完全,这不是最好的UI练习.

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

Abe*_*cht 5

TextBlock在WPF真的不希望削减它的文本.当没有足够的空间时它会这样做,但是一旦ScrollViewer可以滚动,就TextBlock认为它有无限的可用空间,所以它不会修剪.

我认为,要做到这一点最简单的方法是设置MaxWidthTextBlockActualWidthListBox:

<DataTemplate>
    <TextBlock Text="{Binding}" 
               TextTrimming="CharacterEllipsis"
               MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

对于默认的WPF ListBox Style(这会导致滚动条仍然出现),这将会有点过大.我会写一个自定义转换器从这个值中减去大约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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用它来转换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>
Run Code Online (Sandbox Code Playgroud)

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