Erzwingen Sie, dass TextBlock in WPF ListBox eingeschlossen wird

94

Ich habe eine WPF-Listbox, in der Nachrichten angezeigt werden. Es enthält einen Avatar auf der linken Seite und den Benutzernamen und die Nachricht, die vertikal rechts vom Avatar gestapelt sind. Das Layout ist in Ordnung, bis der Nachrichtentext in Zeilenumbruch umgewandelt werden soll. Stattdessen wird eine horizontale Bildlaufleiste im Listenfeld angezeigt.

Ich habe gegoogelt und Lösungen für ähnliche Probleme gefunden, aber keines davon hat funktioniert.

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

Antworten:

132

Der Inhalt von TextBlockkann mit Eigenschaft umbrochen werden TextWrapping. StackPanelVerwenden Sie stattdessen DockPanel/ Grid. Eine weitere Sache - setzen Sie die ScrollViewer.HorizontalScrollBarVisibilityEigenschaft auf den DisabledWert für die ListBox.

Aktualisiert Hiddenauf Disabledbasierend auf dem Kommentar von Matt. Danke Matt.

Nash
quelle
38
Ich denke, Sie müssen ScrollViewer.HorizontalScrollBarVisibility auf "Deaktiviert" anstatt auf "Versteckt" setzen - andernfalls versucht die ListBox immer noch, horizontal zu scrollen, Sie sehen nur die Bildlaufleiste nicht.
Matt Hamilton
9

Das Problem befindet sich möglicherweise nicht in der ListBox. Der TextBlock wird nicht umbrochen, wenn eines der übergeordneten Steuerelemente genügend Speicherplatz bietet, sodass es nicht umbrochen werden muss. Dies kann durch ein ScrollViewer-Steuerelement verursacht werden.

Martin Moser
quelle
1
Vielen Dank! In meinem Fall wurde durch Deaktivieren des horizontalen Bildlaufs in der Listenansicht das Problem ScrollViewer.HorizontalScrollBarVisibility = "Disabled"
behoben
2

Wenn Sie verhindern möchten, dass TextBlock wächst und nur in die Größe des Listenfelds passt, sollten Sie die Breite explizit festlegen.

Um es dynamisch zu ändern, bedeutet es keinen festen Wert, aber Sie müssen ihn an das richtige übergeordnete Element im visuellen Baum binden. Sie können so etwas haben:

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

Wenn dies nicht funktioniert, versuchen Sie, die richtigen Elemente (die an was gebunden werden müssen) mit dem Live Visual Tree in Visual Studio zu finden.

Eifer
quelle