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