#wpf #xaml #listbox #textblock
#wpf #xaml #список #текстовый блок
Вопрос:
У меня есть список, содержащий текстовые блоки.
Иногда содержимое текстового блока слишком длинное, и я хочу, чтобы высота этой записи удваивалась или утроивалась по мере необходимости для размещения текста.
Я попробовал TextWrapping=»Wrap», но это не работает. Каждый текстовый блок по-прежнему имеет высоту всего в одну строку.
Есть ли простой способ устранить проблему в XAML? Спасибо.
* Дополнительная информация: я попытался упростить вопрос, но, возможно, полный сценарий лучше.
- У меня есть список, записи которого отображаются в соответствии с шаблоном в приведенном ниже коде.
- Каждая запись содержит 2 части информации: цену продукта, за которой следует название продукта.
- Я не хочу использовать горизонтальную полосу прокрутки в списке и хочу, чтобы название продукта отображалось в 2 или более строках, если это необходимо. Название продукта — это 2-й текстовый блок.
Вот мой XAML:
<ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock MinWidth="40" TextAlignment="Right" Text = "{Binding ProductPrice}" />
<TextBlock Text = "{Binding ProductName}" TextWrapping="Wrap" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Ответ №1:
Отключите горизонтальное поле списка scrollViewer
. Таким образом textBlock
, он будет вынужден переноситься.
XAML:
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<TextBlock TextWrapping="Wrap"/>
</ListBox>
Пример результата:
Редактировать:
Из добавленного вами XAML я уверен, что проблема заключается в StackPanel
. Попробуйте заменить его, Grid
например:
<ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock MinWidth="40" TextAlignment="Right" Text = "{Binding ProductPrice}" />
<TextBlock Grid.Column="1" Text = "{Binding ProductName}" TextWrapping="Wrap" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
StackPanel
не ограничивает размер содержимого, поэтому textBlock
не знает, где заканчивается пробел, и перенос не происходит.
Комментарии:
1. Я пробовал это, но у меня это не сработало. Как есть, в списке нет горизонтальной полосы прокрутки, поэтому невидимость горизонтальной полосы прокрутки ничего не меняет.
2. @user776676: Не могли бы вы добавить свой XAML к вопросу? Будет легче найти проблему.
3. Спасибо, Майкл, я только что добавил XAML.
4. @user776676: пожалуйста, посмотрите мою правку. Через минуту я добавлю полный xaml.
Ответ №2:
Вы используете StackPanel
. Попробуйте использовать DockPanel
:
<DockPanel>
<TextBlock DockPanel.Dock="Left" MinWidth ="40" TextAlignment="Right" Text = "11.12" />
<TextBlock Text = "{Binding LongText}" DockPanel.Dock="Right" TextWrapping="Wrap" />
</DockPanel>
Например:
Ответ №3:
это поможет вам сделать это. Не TextBlock
устанавливайте размер только для средства просмотра прокрутки, потому что texblock должен быть переменным, поэтому ScrollViewer
он будет применяться Scrollbar
, как только он превысит размер ScrollViewer
.
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<TextBlock/>
</ScrollViewer>
Для ListBoxItem
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.Items>
<TextBlock Text="{Binding LongText}" TextWrapping="Wrap"/>
</ListBox.Items>
</ListBox>
Комментарии:
1. Спасибо, что предоставили возможность использовать горизонтальную полосу прокрутки. Но я не хочу прокручивать по горизонтали. Я хочу, чтобы высота каждого элемента списка автоматически регулировалась в соответствии с текстом.