在下面的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>
答案 0 :(得分:39)
将第三个ColumnDefinition的宽度从“Auto”更改为“*”,这样只会占用水平空间剩余的任何内容。
试图解释一下: WPF中的屏幕区域以两遍算法分布。首先,每个视觉元素询问每个孩子需要多少空间,并指示可用的空间。这些孩子也为孩子做同样的事。 然后每个视觉元素告诉每个孩子他们实际上将获得多少。这些孩子再次为孩子做同样的事。
您的代码未能按照您的意愿执行操作,因为DataTemplate中的Grid告诉其第三列子项,他们可以在第一次运行时拥有所需的所有水平空间(“auto”)。那些文本框然后认为他们不必包装。所以他们只是报告了他们想要的宽度和一条高度的线。 在第二次运行中,Grid发现“auto”比那些孩子想要的要少一点。网格仍然只给他们一条高度的线,所以包装是不可能的。然后孩子们没有其他选择留给他们,而是截断文本。
当第三列宽度设置为“*”时,网格将告诉该列中的子项确切地在第一列获得“auto”并且第二列获得其15之后剩余多少水平像素。文本框可以弄清楚他们可能想要换行,并且他们报告回来“好吧,爸爸,我会用那些微不足道的水平像素做,但至少给我我想要的垂直方向”。垂直空间没有限制,所以他们得到了他们展示所有光荣内容所需的东西。
答案 1 :(得分:3)
尝试将width
提供给TextBlock
,默认情况下TextBlock
占用所有可用空间而不包装文字