2011-04-05 18 views
12

En el siguiente XAML, estoy tratando de ajustar el TextBlock que se une a "PortfolioCodes" y "CommentaryText", pero parece que "Envolver" no funciona para TextBlock. Intenté todas las sugerencias posibles que pude encontrar en este sitio web, pero todo fue en vano. Puede ayudarme alguien, por favor.La propiedad de ajuste de bloqueo de texto no funciona

<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> 

Basado en la respuesta Guge, me han cambiado xaml como a continuación y ahora su trabajo.

<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> 

Respuesta

39

Cambiar el ancho de su tercer ColumnDefinition de "Auto" a "*", de esa manera solo ocupa lo que queda de tu espacio horizontal.

Para intentar explicar esto: El área de la pantalla en WPF se distribuye en un algoritmo de dos pasos. Primero, cada elemento visual le pregunta a cada niño cuánto espacio necesita, con una indicación de cuánto está disponible. Estos niños hacen lo mismo por sus hijos. Luego, cada elemento visual le dice a cada niño cuánto realmente van a obtener. Estos niños, de nuevo, hacen lo mismo por sus hijos.

Su código no pudo hacer lo que quería porque la Grilla en la plantilla de datos le decía a sus hijos de la tercera columna que podían tener todo el espacio horizontal que deseaban ("auto") en la primera ejecución. Esos cuadros de texto pensaron que no tendrían que envolverlos. Entonces, simplemente informaron el ancho deseado y una línea que vale la altura. En la segunda ejecución, la Grilla descubrió que "automático" resultó ser un poco menos de lo que querían esos niños. Y la Grilla aún solo les dio una línea que valía la altura, por lo que envolverse era imposible. A los niños no les quedaba otra opción más que truncar el texto.

Cuando el ancho de la tercera columna se establece en "*", la cuadrícula le dirá a los niños en esa columna exactamente cuántos píxeles horizontales quedan después de que la primera columna obtuvo su "auto" y la segunda columna obtuvo su 15. Ahora los cuadros de texto pueden darse cuenta de que es posible que deseen ajustarlos, y responden "Ok, papá, me las arreglaré con esos miserables píxeles horizontales, pero al menos dame lo que quiero en las verticales". No hay límite para el espacio vertical, por lo que obtienen lo que necesitan para presentar todo su contenido glorioso.

+4

Explicación destacada de lo que sucede bajo el capó de WPF. +1 no parece suficiente. – GSTD

+1

Gracias Guge, funcionó y muy buena explicación de hecho. Siempre recordaré esto ahora. – TheITGuy

+0

Gracias por los comentarios, eres muy amable. – Guge

3

tratar de dar a su widthTextBlock, por defecto TextBlock toma todo el espacio disponible y no se ajusta el texto

Cuestiones relacionadas