TextBlock Wrapping属性不起作用

时间:2011-04-05 10:53:29

标签: wpf xaml

在下面的XAML中,我试图包装绑定到“PortfolioCodes”和“CommentaryText”的TextBlock,但似乎“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>

2 个答案:

答案 0 :(得分:39)

将第三个ColumnDefinition的宽度从“Auto”更改为“*”,这样只会占用水平空间剩余的任何内容。

试图解释一下: WPF中的屏幕区域以两遍算法分布。首先,每个视觉元素询问每个孩子需要多少空间,并指示可用的空间。这些孩子也为孩子做同样的事。 然后每个视觉元素告诉每个孩子他们实际上将获得多少。这些孩子再次为孩子做同样的事。

您的代码未能按照您的意愿执行操作,因为DataTemplate中的Grid告诉其第三列子项,他们可以在第一次运行时拥有所需的所有水平空间(“auto”)。那些文本框然后认为他们不必包装。所以他们只是报告了他们想要的宽度和一条高度的线。 在第二次运行中,Grid发现“auto”比那些孩子想要的要少一点。网格仍然只给他们一条高度的线,所以包装是不可能的。然后孩子们没有其他选择留给他们,而是截断文本。

当第三列宽度设置为“*”时,网格将告诉该列中的子项确切地在第一列获得“auto”并且第二列获得其15之后剩余多少水平像素。文本框可以弄清楚他们可能想要换行,并且他们报告回来“好吧,爸爸,我会用那些微不足道的水平像素做,但至少给我我想要的垂直方向”。垂直空间没有限制,所以他们得到了他们展示所有光荣内容所需的东西。

答案 1 :(得分:3)

尝试将width提供给TextBlock,默认情况下TextBlock占用所有可用空间而不包装文字