Силу TextBlock, чтобы обернуть в WPF ListBox элемент


У меня есть список 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>
3 90

3 ответа:

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

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

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

Если вы хотите предотвратить рост 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>

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