Подтвердить что ты не робот

Свойство TextBlock Wrapping не работает

В следующем XAML я пытаюсь обернуть TextBlock, который привязывается к "PortfolioCodes" и "CommentaryText", но кажется, что "Wrapping" не работает для TextBlock. Я пробовал все возможные предложения, которые я мог найти на этом веб-сайте, но все напрасно. Может кто-то может помочь.

    <Grid>
    <ListBox ItemsSource="{Binding Path=Summaries}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border CornerRadius="5" BorderBrush="LightGray" BorderThickness="1" Padding="4" Margin="4">
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="15"></ColumnDefinition>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0">No Of Security</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding Path=PortfolioSecurityCount}"></TextBlock>

                        <TextBlock Grid.Column="0" Grid.Row="1">Portfolio Code(s)</TextBlock>
                        <Grid Grid.Column="2" Grid.Row="1" >
                            <TextBlock TextWrapping="Wrap" Text="{Binding Path=PortfolioCodes}"></TextBlock>
                        </Grid>

                        <TextBlock Grid.Column="0" Grid.Row="2">Commentary Text</TextBlock>
                        <Grid Grid.Column="2" Grid.Row="2" >
                            <TextBlock Grid.Column="2" Grid.Row="2" TextWrapping="Wrap"  Text="{Binding Path=CommentaryText}"></TextBlock>
                        </Grid>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

На основе ответа Guge я изменил xaml, как показано ниже, и теперь он работает.

    <Grid x:Name="LayoutRoot">
    <ListBox x:Name="SummaryListBox" ItemsSource="{Binding Path=Summaries}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border CornerRadius="5" BorderBrush="LightGray" BorderThickness="1" Padding="4" Margin="4">
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="15"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0">No Of Security</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding Path=PortfolioSecurityCount}"></TextBlock>

                        <TextBlock Grid.Column="0" Grid.Row="1">Portfolio Code(s)</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Path=PortfolioCodes}" ></TextBlock>

                        <TextBlock Grid.Column="0" Grid.Row="2">Commentary Text</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="2" TextWrapping="Wrap"  Text="{Binding Path=CommentaryText}"></TextBlock>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
4b9b3361

Ответ 1

Измените ширину третьего значения ColumnDefinition с "Auto" на "*", таким образом, он занимает только то, что осталось от вашего горизонтального пространства.

Чтобы попытаться объяснить это: Площадь экрана в WPF распределяется в двухпроходном алгоритме. Сначала каждый визуальный элемент задает каждому ребенку, сколько места ему нужно, с указанием того, сколько доступно. Эти дети делают то же самое для своих детей. Затем каждый визуальный элемент сообщает каждому ребенку, сколько он на самом деле собирается получить. Эти дети, опять же, делают то же самое для своих детей.

Ваш код не смог выполнить то, что вам нужно, потому что Grid в DataTemplate сообщила своим третьим родителям о столбцах, что в первом прогоне они могут иметь все необходимое горизонтальное пространство ( "авто" ). Эти текстовые поля затем подумали, что их не придется обертывать. Поэтому они только что сообщили о своей желаемой ширине и высоте одной строки. Во втором запуске Grid обнаружила, что "авто" оказалось немного меньше, чем хотелось этим детям. И сетка по-прежнему давала им только одну линию высоты, поэтому обертывание не могло быть и речи. У детей тогда не оставалось другого выбора, кроме как урезать текст.

Когда ширина третьего столбца установлена ​​на "*", сетка будет указывать детям в этом столбце точно, сколько горизонтальных пикселей осталось после того, как первый столбец получил свой "авто" , а второй столбец получил свои 15. Теперь текстовые поля могут понять, что они могут захотеть обернуть, и они отчитаются "Хорошо, папа, я позабочусь об этих жалких горизонтальных пикселях, но, по крайней мере, даю мне то, что хочу в вертикалях". Для вертикального пространства нет предела, поэтому они получают то, что им нужно, чтобы представить весь свой славный контент.

Ответ 2

Попробуйте дать width вашему TextBlock, по умолчанию TextBlock берет все свободное пространство и не переносит текст