96

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

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

<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>
4

3 回答 3

135

的内容TextBlock可以使用 property 进行包装TextWrapping。而不是StackPanel,使用DockPanel/ Grid。还有一件事 - 将ScrollViewer.HorizontalScrollBarVisibility属性设置DisabledListBox.

根据马特的评论更新Hidden为。Disabled谢谢马特。

于 2008-12-29T07:35:24.950 回答
9

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

于 2008-12-29T07:23:14.787 回答
3

如果您想阻止 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找到正确的元素(必须绑定到什么)。

于 2017-01-11T15:21:10.327 回答