XAML TextBlock: Как заставить TextBlock иметь переменную высоту? - PullRequest
1 голос
/ 14 октября 2011

У меня есть ListBox, который содержит TextBlocks.

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

Я пробовал 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>

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

Отключить горизонтальный список scrollViewer. Таким образом, textBlock будет принудительно упакован.

XAML:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
      <TextBlock TextWrapping="Wrap"/>
</ListBox>

Пример результата:

enter image description here

Изменить:

Из добавленного вами 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 голос
/ 14 октября 2011

Вы используете StackPanel. Попробуйте использовать DockPanel:

<DockPanel>
 <TextBlock  DockPanel.Dock="Left" MinWidth ="40"  TextAlignment="Right" Text = "11.12" />
 <TextBlock Text = "{Binding LongText}" DockPanel.Dock="Right" TextWrapping="Wrap" />
</DockPanel>

Например:

enter image description here

1 голос
/ 14 октября 2011

это поможет вам сделать это.Dont Size 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>
...