Текстовый блок WPF в списке не обрезается должным образом

Вот что мне нужно: ListBox, элементы которого состоят из StackPanel с двумя TextBlock. Текстовые блоки должны поддерживать перенос, список не должен расширяться, и не должно быть горизонтальной полосы прокрутки. Вот код, который у меня есть до сих пор. Скопируйте и вставьте его в 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>

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

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


person Tobias Funke    schedule 21.05.2010    source источник
comment
Очень хороший вопрос. Я склонен думать, что это ошибка в WPF TextBlock.   -  person bitbonk    schedule 21.05.2010


Ответы (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>
person Abe Heidebrecht    schedule 21.05.2010
comment
Второй работал отлично! Это работает, даже если я делаю полосы прокрутки шире, используя настройки дисплея. Спасибо! - person Tobias Funke; 22.05.2010

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

  <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">
person bitbonk    schedule 21.05.2010