Force TextBlock для переноса в WPF ListBox

У меня есть список WPF, который отображает сообщения. Он содержит аватар с левой стороны и имя пользователя и сообщение, расположенные вертикально справа от аватара. Макет отлично до тех пор, пока текст сообщения не будет обертываться словами, но вместо этого я получаю горизонтальную полосу прокрутки в списке.

У меня Googled и нашел решения для подобных проблем, но никто из них не работал.

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

Ответ 1

Содержимое TextBlock можно обернуть, используя свойство TextWrapping. Вместо StackPanel используйте DockPanel/Grid. Еще одна вещь - установите для свойства ScrollViewer.HorizontalScrollBarVisibility значение ScrollViewer.HorizontalScrollBarVisibility для ListBox.

Обновлен Hidden до Disabled на основе комментария Matt. Спасибо Мэтту.

Ответ 2

Проблема не может быть обнаружена в ListBox. TextBlock не будет обертываться, если один из родительских элементов управления обеспечивает достаточное пространство, так что ему не нужно обертывать. Это может быть вызвано элементом управления ScrollViewer.

Ответ 3

Если вы хотите, чтобы TextBlock не увеличивался, и вы хотите, чтобы он просто соответствовал размеру списка, вы должны явно установить его ширину.

Чтобы динамически изменять его, это означает не значение fix, но вам нужно привязать его к его правильному родительскому элементу в визуальном дереве. У вас может быть что-то вроде этого:

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

Если это не сработает, попробуйте найти соответствующие элементы (которые должны быть привязаны к чему) с помощью Live Visual Tree в Visual Studio.