文本块换行属性不起作用

12
在下面的XAML代码中,我试图对绑定到“PortfolioCodes”和“CommentaryText”的TextBlock进行换行处理,但似乎TextBlock不支持“Wrapping”。我已经尝试了在该网站上能找到的所有建议,但都无济于事。请问有人可以帮忙吗?
    <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>
2个回答

41

将第三个ColumnDefinition的宽度从"Auto"更改为"*",这样它只会占据水平空间剩余的部分。

尝试解释一下: 在WPF中,屏幕区域是通过两次传递算法进行分配的。首先,每个可视元素询问每个子元素需要多少空间,并指示可用空间的数量。这些子项对其子项执行相同的操作。 然后,每个可视元素告诉每个子元素他们实际上将获得多少空间。这些子项再次对其子项执行相同的操作。

您的代码未能实现您想要的效果,因为DataTemplate中的Grid在第一次运行时告诉其第三列子元素可以使用所有水平空间(“auto”)。然后,那些文本框认为它们不需要换行。因此,它们仅报告所需的宽度和一行高度。 在第二次运行中,Grid发现“auto”的大小比那些子元素想要的要小一些。而且Grid仍然只给了它们一行的高度,因此换行是不可能的。子项只剩下截断文本的选项。

当第三列宽度设置为“*”时,Grid将向该列的子项准确告知第一列获取其“auto”和第二列获取其15后剩余的水平像素数量。现在,文本框可以确定它们可能需要换行,并报告“好的,爸爸,我将利用那些微不足道的水平像素,但至少在垂直方面给我所需的内容”。“没有垂直空间限制,因此它们获得了展示所有内容所需的空间。


4
WPF内部运作原理的解释非常出色!+1似乎不足以表达。 - GSTD
1
谢谢谷歌,它起作用了,确实是非常好的解释。我现在会一直记得这个。 - TheITGuy

3
尝试给你的添加width属性,因为默认情况下会占用所有可用空间并且不换行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接