2008-12-29 9 views
88

J'ai une liste déroulante WPF qui affiche les messages. Il contient un avatar sur le côté gauche et le nom d'utilisateur et le message empilés verticalement à la droite de l'avatar. La mise en page est bonne jusqu'à ce que le texte du message doit renvoyer le mot, mais à la place, je reçois une barre de défilement horizontale dans la zone de liste.Force TextBlock à envelopper dans WPF ListBox

J'ai recherché et trouvé des solutions à des problèmes similaires, mais aucun d'entre eux 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> 

Répondre

120

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

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

+36

Je pense que vous devez définir ScrollViewer.HorizontalScrollBarVisibility sur "Disabled" plutôt que "Hidden" - sinon le ListBox essaiera toujours de faire défiler horizontalement, vous juste ne verra pas la barre de défilement. –

8

Le problème ne se trouve peut-être pas dans le contrôle ListBox. Le TextBlock ne s'enroulera pas, si l'un des contrôles parent fournit suffisamment d'espace, de sorte qu'il n'a pas besoin d'être enveloppé. Cela peut être provoqué par un contrôle ScrollViewer.

+0

Merci! dans mon cas, la désactivation du défilement horizontal dans la liste a corrigé le problème ScrollViewer.HorizontalScrollBarVisibility = "Disabled" – Ateik

0

Si vous souhaitez empêcher le développement de TextBlock et que vous souhaitez qu'il corresponde à la taille de la zone de liste, vous devez en définir explicitement la largeur.

Pour le modifier 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 ceci:

<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 doit être binded à ce que) avec l'arbre visuel en direct dans Visual Studio.