WPF Textblock в Listbox не обрезается должным образом


Вот что я хочу: a ListBox, элементы которого состоят из StackPanel с двумя TextBlock s. текстовые блоки должны поддерживать перенос, список не должен расширяться, и не должно быть горизонтальной полосы прокрутки. Вот код, который у меня есть до сих пор. Скопируйте и вставьте его в XamlPad, и вы увидите, о чем я говорю:

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

Похоже, что это делает работу по удержанию текстовых блоков от роста, но есть одна проблема. Текстовые блоки кажутся немного больше, чем список, в результате чего появится горизонтальная полоса прокрутки. Это странно, потому что их ширина привязана к фактической ширине lisbox. Кроме того, если добавить еще несколько элементов в список (просто вырезать и вставить в XamlPad), в результате чего появится вертикальная полоса прокрутки, ширина текстовых блоков не изменится на вертикальную полосу прокрутки.

Как мне сохранить TextBlock s внутри ListBox, с вертикальной полосой прокрутки или без нее?

2 2

2 ответа:

Есть два способа сделать это, но я думаю, что вы действительно хотите отключить горизонтальную полосу прокрутки, которая выполняется с помощью вложенного свойства:

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

Затем можно удалить привязки ширины на TextBlocks.

Другой вариант-привязать ширину TextBlocks к ширине ScrollContentPresenter's ActualWidth через 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>

Вы можете обойти проблему следующим образом:

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

Это может не сработать, если размер шрифта изменится. Другой (и, вероятно, лучший) способ-полностью отключить полосу прокрутки:

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