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.