Свойство TextBlock Wrapping не работает - PullRequest
12 голосов
/ 05 апреля 2011

В следующем 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>

Основываясь на ответе Гуге, я изменил 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>

Ответы [ 2 ]

39 голосов
/ 05 апреля 2011

Измените ширину вашего третьего ColumnDefinition с «Авто» на «*», чтобы он занимал только то, что осталось от вашего горизонтального пространства.

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

Ваш код не смог выполнить то, что вы хотели, потому что Grid в DataTemplate сообщал дочерним элементам третьего столбца, что они могут иметь все желаемое горизонтальное пространство («авто») при первом запуске. Те текстовые поля тогда думали, что им не придется оборачиваться. Таким образом, они только что сообщили желаемую ширину и высоту в одну строку. Во втором заезде Грид обнаружил, что «авто» оказалось немного меньше, чем хотели те дети. И Сетка все еще давала им только одну строчку высоты, так что об упаковке не могло быть и речи. Тогда у детей не было другого выбора, кроме как обрезать текст.

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

3 голосов
/ 05 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...