2011-04-05 7 views
12

다음 XAML에서 "PortfolioCodes"및 "CommentaryText"에 바인딩하는 TextBlock을 래핑하려고하는데 TextBlock에 대해 "배치"가 작동하지 않는 것 같습니다. 이 웹 사이트에서 찾을 수있는 모든 가능한 제안을 시도했지만 모두 헛된 것입니다. 누군가 제발 도와 줄 수 있어요.TextBlock Wrapping 속성이 작동하지 않습니다.

<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의 화면 영역은 2 단계 알고리즘으로 배포됩니다. 먼저 각 시각적 요소는 얼마나 많은 공간이 필요한지 각 어린이에게 사용 가능한지 표시합니다. 이 아이들은 아이들에게 똑같이합니다. 그런 다음 각 시각적 요소는 실제로 얼마나 많은 양을 가져다 주는지 각 어린이에게 알려줍니다. 이 아이들은 다시 그들의 아이들을 위해 똑같이 행동합니다.

DataTemplate의 Grid가 첫 번째 실행에서 원했던 모든 수평 공간 ("자동")을 가질 수 있으므로 DataTemplate의 Grid가 자신의 세 번째 열 자식에게 말했기 때문에 코드가 원하는 작업을 수행하지 못했습니다. 그런 다음 해당 텍스트 상자는 줄 바꿈하지 않아도된다고 생각했습니다. 그래서 그들은 단지 원하는 너비와 한 줄의 높이를보고했습니다. 두 번째 실행에서 Grid는 "auto"가 해당 자식이 원했던 것보다 약간 적음을 발견했습니다. 그리드는 여전히 한 줄의 높이 만 줄었고 포장은 문제가되지 않았습니다. 그런 다음 아이들은 텍스트를 잘라내 기 위해 다른 옵션을 남기지 않았습니다.

세 번째 열 너비가 "*"로 설정되면 눈금은 해당 열의 자식에게 첫 번째 열에 "자동"이 있고 두 번째 열에 15를 얻은 후 몇 개의 가로 픽셀이 남았는지를 알려줍니다. 이제 텍스트 상자는 랩핑을 원할 수도 있다는 것을 알아낼 수 있습니다. 그리고 그들은 "Ok, 아빠, 나는 그 평범한 수평 픽셀로 할 것이지만, 적어도 내가 원하는 수직선으로 나에게 줄 것"이라고 다시보고합니다. 수직 공간에는 제한이 없으므로 모든 영광스러운 콘텐츠를 제공하는 데 필요한 것을 얻습니다.

+4

WPF의 내부에서 일어나는 일에 대한 뛰어난 설명! +1이 충분하지 않은 것 같습니다. – GSTD

+1

감사합니다. Guge, 그것은 일하고 매우 훌륭한 설명을했습니다. 나는 항상 이것을 기억할 것이다. – TheITGuy

+0

의견을 보내 주셔서 감사합니다. 너무 친절합니다. – Guge

3

시도 기본 TextBlock으로, 당신의 TextBlockwidth을 제공하기 위해 가능한 모든 공간을 소요에 "*"그런 식으로 "자동"에서 텍스트

관련 문제