Принудительно переносить TextBlock в WPF ListBox - PullRequest
92 голосов
/ 29 декабря 2008

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

130 голосов
/ 29 декабря 2008

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

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

9 голосов
/ 29 декабря 2008

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

2 голосов
/ 11 января 2017

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

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

...