Forzar TextBlock para ajustar en el ListBox de WPF


Tengo un listbox WPF que muestra mensajes. Contiene un avatar en el lado izquierdo y el nombre de usuario y el mensaje apilados verticalmente a la derecha del avatar. El diseño está bien hasta que el texto del mensaje se ajuste a la línea, pero en su lugar obtengo una barra de desplazamiento horizontal en el listbox.

He buscado en Google y encontrado soluciones a problemas similares, pero ninguno de ellos funcionó.

<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>
Author: Sergey Brunov, 2008-12-29

3 answers

El contenido de TextBlock se puede empaquetar usando la propiedad TextWrapping. En lugar de StackPanel, utilice DockPanel/Grid. Una cosa más - establezca la propiedad ScrollViewer.HorizontalScrollBarVisibility en el valor Disabled para el ListBox.

Actualizado Hidden a Disabled basado en el comentario de Matt. Gracias Matt.

 124
Author: Nash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-23 05:47:46

Es posible que el problema no se encuentre en el ListBox. El TextBlock no se ajustará, si uno de los controles padre proporciona suficiente espacio, para que no tenga la necesidad de ajustarse. Esto puede ser causado por un control ScrollViewer.

 9
Author: Martin Moser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-29 07:23:14

Si desea evitar que TextBlock crezca, y desea que solo quepa en el tamaño del listbox, debe establecer el ancho de la misma explícitamente.

Para cambiarlo dinámicamente, no significa un valor fijo, pero debe vincularlo a su elemento padre adecuado en el árbol visual. Puedes tener algo como esto:

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

Si no funciona, intente encontrar los elementos adecuados (que deben vincularse a qué) con el Live Visual Tree en Visual Studio.

 1
Author: eldor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 15:21:10