Текстовый блок XAML: как сделать, чтобы текстовый блок имел переменную высоту?

#wpf #xaml #listbox #textblock

#wpf #xaml #список #текстовый блок

Вопрос:

У меня есть список, содержащий текстовые блоки.

Иногда содержимое текстового блока слишком длинное, и я хочу, чтобы высота этой записи удваивалась или утроивалась по мере необходимости для размещения текста.

Я попробовал TextWrapping=»Wrap», но это не работает. Каждый текстовый блок по-прежнему имеет высоту всего в одну строку.

Есть ли простой способ устранить проблему в XAML? Спасибо.

* Дополнительная информация: я попытался упростить вопрос, но, возможно, полный сценарий лучше.

  1. У меня есть список, записи которого отображаются в соответствии с шаблоном в приведенном ниже коде.
  2. Каждая запись содержит 2 части информации: цену продукта, за которой следует название продукта.
  3. Я не хочу использовать горизонтальную полосу прокрутки в списке и хочу, чтобы название продукта отображалось в 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. Спасибо, что предоставили возможность использовать горизонтальную полосу прокрутки. Но я не хочу прокручивать по горизонтали. Я хочу, чтобы высота каждого элемента списка автоматически регулировалась в соответствии с текстом.