web-dev-qa-db-fra.com

Forcer TextBlock à encapsuler dans WPF ListBox

J'ai une zone de liste WPF qui affiche des messages. Il contient un avatar sur le côté gauche et le nom d'utilisateur et le message empilés verticalement à droite de l'avatar. La mise en page est correcte jusqu'à ce que le texte du message soit renvoyé à la ligne, mais à la place, j'obtiens une barre de défilement horizontale dans la zone de liste.

J'ai recherché sur Google et trouvé des solutions à des problèmes similaires, mais aucun n'a fonctionné.

<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>
92
Eric Haskins

Le contenu de TextBlock peut être encapsulé à l'aide de la propriété TextWrapping. Au lieu de StackPanel, utilisez DockPanel/Grid. Encore une chose - définissez ScrollViewer.HorizontalScrollBarVisibility propriété à Disabled valeur pour ListBox.

Hidden à Disabled mis à jour sur la base des commentaires de Matt. Merci Matt.

130
Nash

Le problème peut ne pas être localisé dans la ListBox. Le TextBlock ne sera pas encapsulé, si l'un des contrôles parents fournit suffisamment d'espace, de sorte qu'il n'a pas besoin d'être encapsulé. Cela peut être dû à un contrôle ScrollViewer.

9
Martin Moser

Si vous souhaitez empêcher TextBlock de croître et que vous souhaitez qu'il tienne simplement dans la taille de la zone de liste, vous devez en définir la largeur de manière explicite.

Pour le changer dynamiquement, cela ne signifie pas une valeur fixe, mais vous devez le lier à son élément parent approprié dans l'arborescence visuelle. Vous pouvez avoir quelque chose comme ça:

<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 cela ne fonctionne pas, essayez de trouver les éléments appropriés (qui doivent être liés à quoi) avec Live Visual Tree dans Visual Studio.

2
eldor