2011-04-05 66 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採取一切可用的空間,並且不換行文本