Примусити TextBlock обернутися в WPF ListBox


94

У мене є список WPF, який відображає повідомлення. Він містить аватар з лівого боку та ім’я користувача та повідомлення, розташовані вертикально праворуч від аватара. Макет чудовий, поки текст повідомлення не повинен переноситися словами, але замість цього я отримую горизонтальну смугу прокрутки на полі списку.

Я шукав у Google і знаходив рішення подібних проблем, але жодне з них не працювало.

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

Відповіді:


132

Зміст TextBlockможна обернути за допомогою властивості TextWrapping. Замість StackPanel, використовуйте DockPanel/ Grid. Ще одне - встановіть для ScrollViewer.HorizontalScrollBarVisibilityвластивості Disabledзначення для ListBox.

Оновлено Hiddenна Disabledоснові коментаря від Метта. Дякую Метт.


38
Я думаю, вам потрібно встановити для ScrollViewer.HorizontalScrollBarVisibility значення "Disabled", а не "Hidden" - інакше ListBox все одно спробує прокрутити горизонтально, ви просто не побачите смугу прокрутки.
Метт Гамільтон,

9

Проблема може не знаходитись у ListBox. TextBlock не обернеться, якщо один із батьківських елементів керування надає достатньо місця, щоб у нього не було необхідності обертати. Це може бути спричинено елементом керування ScrollViewer.


1
Дякую! у моєму випадку відключення горизонтальної прокрутки в списку виправлено проблему ScrollViewer.HorizontalScrollBarVisibility = "Вимкнено"
Ateik

2

Якщо ви хочете, щоб TextBlock не ростав, і ви хочете, щоб він просто відповідав розміру вікна списку, вам слід чітко встановити його ширину.

Для того, щоб змінити його динамічно, це означає не значення виправлення, але вам потрібно прив'язати його до належного батьківського елементу у візуальному дереві. Ви можете мати щось подібне:

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

Якщо це не спрацьовує, спробуйте знайти відповідні елементи (які потрібно прив’язати до чого) за допомогою Live Visual Tree у Visual Studio.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.