强制WPF ListBox中的TextBlock换行

96

我有一个WPF listbox,用于显示消息。它在左侧包含一个头像,在头像的右侧垂直地堆叠着用户名和消息。布局一切正常,直到消息文本应该自动换行,但实际上列表框出现了横向滚动条。

我尝试过谷歌搜索并找到了类似问题的解决方案,但都无法解决我的问题。

<ListBox HorizontalContentAlignment="Stretch"  ItemsSource="{Binding Path=FriendsTimeline}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Border BorderBrush="DarkBlue" BorderThickness="3" CornerRadius="2" Margin="3" >
                    <Image Height="32" Width="32"  Source="{Binding Path=User.ProfileImageUrl}"/>
                </Border>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Path=User.UserName}"/>
                    <TextBlock Text="{Binding Path=Text}" TextWrapping="WrapWithOverflow"/> <!-- This is the textblock I'm having issues with. -->
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
3个回答

135

TextBlock的内容可以使用属性TextWrapping进行换行。除了使用StackPanel,还可以使用DockPanel / Grid。还有一件事 - 为ListBox设置ScrollViewer.HorizontalScrollBarVisibility属性的值为Disabled

根据Matt的评论更新HiddenDisabled。感谢Matt。


38
我认为你需要将ScrollViewer.HorizontalScrollBarVisibility属性设置为"Disabled"而不是"Hidden",否则ListBox仍会尝试水平滚动,只是你看不到滚动条。 - Matt Hamilton

9
问题可能不在ListBox中。如果父控件提供了足够的空间,使得TextBlock没有必要换行,那么它就不会自动换行。这可能是由于 ScrollViewer 控件引起的。

1
谢谢!在我的情况下,禁用ListView中的水平滚动解决了问题。ScrollViewer.HorizontalScrollBarVisibility="Disabled" - Ateik

3

如果您想防止TextBlock增长,并希望它仅适合于listbox的大小,则应明确设置其宽度。

为了动态更改它,这意味着不是固定值,而是需要将其绑定到视觉树中的适当父元素。您可以像这样:

<ListBox ItemsSource="{Binding MyItems}" Name="MyListBox">

  <ListBox.Resources>
    <Style TargetType="ListBoxItem">
      <Setter Property="Width" 
              Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ScrollContentPresenter}, Path=ActualWidth}" />
    </Style>
  </ListBox.Resources>

  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
    </DataTemplate>
  </ListBox.ItemTemplate>

</ListBox>

如果不起作用,尝试使用Visual Studio中的Live Visual Tree找到适当的元素(必须绑定到什么)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接