it-swarm.com.de

Erzwinge den Umbruch von TextBlock in WPF ListBox

Ich habe eine WPF-Listbox, in der Nachrichten angezeigt werden. Auf der linken Seite befindet sich ein Avatar, und der Benutzername und die Nachricht sind vertikal rechts neben dem Avatar angeordnet. Das Layout ist in Ordnung, bis der Nachrichtentext in Word umbrochen wird. 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>
92
Eric Haskins

Der Inhalt von TextBlock kann mit der Eigenschaft TextWrapping umbrochen werden. Verwenden Sie statt StackPanelDockPanel/Grid. Noch eine Sache - set ScrollViewer.HorizontalScrollBarVisibility Eigenschaft auf Disabled Wert für ListBox.

Hidden auf Disabled aktualisiert, basierend auf einem Kommentar von Matt. Vielen Dank, Matt.

130
Nash

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

9
Martin Moser

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

Um es dynamisch zu ändern, handelt es sich nicht um einen festen Wert, sondern Sie müssen es an das richtige übergeordnete Element in der visuellen Struktur 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 es nicht funktioniert, versuchen Sie, die richtigen Elemente (die an was gebunden werden müssen) mit Live Visual Tree in Visual Studio zu finden.

2
eldor