2010-05-21 3 views
2

Voici ce que je veux: Un ListBox dont les éléments se composent d'un StackPanel avec deux TextBlock s. Les blocs de texte doivent prendre en charge l'habillage, la liste ne doit pas être développée et il ne doit pas y avoir de barre de défilement horizontale. Voici le code que j'ai jusqu'ici. Copiez et collez-le dans XamlPad et vous verrez ce que je parle:WPF Textblock dans Listbox ne pas écrêtage correctement

<ListBox Height="300" Width="300" x:Name="tvShows"> 
    <ListBox.Items> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 

Cela semble faire le travail de garder les TextBlocks de plus en plus, mais il y a un problème. Les blocs de texte semblent être légèrement plus grands que la zone de liste, provoquant l'apparition de la barre de défilement horizontale. C'est étrange parce que leurs largeurs sont liées à la largeur réelle de lisbox. De plus, si vous ajoutez un peu plus d'éléments à la liste (il suffit de couper et coller dans XamlPad), la barre de défilement verticale apparaîtra, et la largeur des blocs de texte ne sera pas redimensionnée dans la barre de défilement verticale.

Comment conserver les TextBlock dans le ListBox, avec ou sans la barre de défilement verticale?

+0

Très bonne question. J'ai tendance à penser que c'est un bug dans le TextBlock WPF. – bitbonk

Répondre

3

Il y a deux façons de le faire, mais je pense que ce que vous voulez vraiment est de désactiver la barre de défilement horizontale, ce qui se fait avec un joint propriété:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
... 

Vous pouvez ensuite supprimer les liaisons de largeur sur le TextBlocks.

Votre autre option est de lier les largeurs TextBlocks aux ScrollContentPresenter'sActualWidth via les liaisons RelativeSource:

<ListBox Height="300" Width="300" x:Name="tvShows" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
    <ListBox.Items> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 
+0

Le second a parfaitement fonctionné! Cela fonctionne même si je rends les barres de défilement plus larges en utilisant les paramètres d'affichage. Merci! –

0

Vous pouvez contourner le problème comme celui-ci:

<ListBox.Resources> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Margin" Value="0 0 -6 0" /> 
     <Setter Property="Padding" Value="0 0 6 0" /> 
    </Style> 
    </ListBox.Resources> 

Cela pourrait ne pas fonctionner correctement si les changements de FontSize. autre (et probablement meilleure) est de désactiver la barre de défilement complètement:

<ListBox x:Name="tvShows" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
Questions connexes