Текстовый блок WPF в списке не правильно обрезается - PullRequest
2 голосов
/ 21 мая 2010

Вот что я хочу: 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>

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

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

Ответы [ 2 ]

3 голосов
/ 22 мая 2010

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

<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>
0 голосов
/ 21 мая 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">
...