在下面的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.现在文本框可以弄清楚他们可能想要换行,然后他们报告说"好吧,爸爸,我会用那些微不足道的水平像素来做,但至少可以在垂直方面给我我想要的东西".垂直空间没有限制,所以他们得到了他们展示所有光荣内容所需的东西.