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 ответа:
Есть два способа сделать это, но я думаю, что вы действительно хотите отключить горизонтальную полосу прокрутки, которая выполняется с помощью вложенного свойства:
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"> ...Затем можно удалить привязки ширины на
TextBlocks.Другой вариант-привязать ширину
TextBlocksк ширинеScrollContentPresenter'sActualWidthчерез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">