强制TextBlock在WPF ListBox中换行

时间:2008-12-29 07:01:49

标签: wpf listbox word-wrap textblock

我有一个显示消息的WPF列表框。它包含左侧的头像和垂直堆叠在头像右侧的用户名和消息。布局很好,直到消息文本应自动换行,但我在列表框上得到一个水平滚动条。

我用Google搜索并找到了类似问题的解决方案,但没有一个能够解决问题。

<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 个答案:

答案 0 :(得分:130)

可以使用属性TextBlock包装TextWrapping的内容。 而不是StackPanel,请使用DockPanel / Grid。 还有一件事 - 将ScrollViewer.HorizontalScrollBarVisibility的{​​{1}}属性设为Disabled

根据Matt的评论,将ListBox更新为Hidden。谢谢马特。

答案 1 :(得分:9)

问题可能不在ListBox中。如果其中一个父控件提供了足够的空间,TextBlock将不会换行,因此它不需要换行。这可能是由ScrollViewer控件引起的。

答案 2 :(得分:1)

如果你想阻止TextBlock增长,并且你希望它只是适合列表框的大小,你应该明确地设置它的宽度。

为了动态更改它,它意味着不是修复值,但您需要将其绑定到可视树中的正确父元素。你可以这样:

<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 找到正确的元素(必须绑定到哪些元素)。