Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 文本块中的文本未在列表框中正确修剪_Wpf_Listbox_Scrollviewer_Textblock_Texttrimming - Fatal编程技术网

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>