2011-04-05 60 views
12

在下面的XAML中,我试图包装绑定到“PortfolioCodes”和“CommentaryText”的TextBlock,但似乎“包装”不适用于TextBlock。我试着在网站上找到所有可能的建议,但都是徒劳的。有人可以请帮助。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> 

回答

39

变化从“自动”为“*”,这样,你的第三个ColumnDefinition的宽度它只占用你的水平空间的剩余部分。

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

由于DataTemplate中的网格告诉第三栏的孩子,他们在第一次运行时可能会有所需的所有水平空间(“自动”),所以您的代码未能做到您想要的。那些文本框然后认为他们不必包装。所以他们只报告了他们想要的宽度,以及一行身高。 在第二次运行中,网格发现“自动”显然比那些孩子想要的要少一些。网格仍然只给了他们一行的身高,所以包装是不可能的。孩子们没有其他选择留给他们,但截断了文本。

当第三列宽度设置为“*”时,网格会告诉该列中的子节点确切地说,在第一列获得“自动”并且第二列获得它们15之后剩下多少个水平像素。现在,文本框可以找出他们可能想要打包的东西,然后他们回报“好吧,爸爸,我会用那些可怜的水平像素做的,但至少在垂直方向给我想要的东西。”垂直空间没有限制,所以他们得到他们需要展示他们所有的光荣内容。

+4

关于WPF引擎下发生了什么的杰出解释! +1看起来不够。 – GSTD 2011-04-05 11:47:07

+1

感谢古格,它的工作和行为非常好的解释。我现在一直会记住这一点。 – TheITGuy 2011-04-05 12:07:25

+0

感谢您的反馈,您太客气了。 – Guge 2011-04-05 16:21:18

3

尽量给widthTextBlock,默认情况下TextBlock采取一切可用的空间,并且不换行文本