TextBlock Wrapping属性不起作用

The*_*Guy 12 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>
Run Code Online (Sandbox Code Playgroud)

根据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>
Run Code Online (Sandbox Code Playgroud)

Gug*_*uge 39

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

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

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

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

  • WPF引擎盖下发生的事情的杰出解释!+1似乎不够. (4认同)