2009-05-10 10 views
4

J'ai une grille définie simplement:WPF: Texte emballage ne fonctionne pas

<Grid Margin="0,5,0,0"> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="50"></ColumnDefinition> 
    <ColumnDefinition Width="50"></ColumnDefinition> 
    <ColumnDefinition Width="48"></ColumnDefinition> 
    <ColumnDefinition Width="Auto"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

Je suis en train de lier un contenu comme celui-ci:

<TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}"> 

Mettre en place comme celui-ci, le le texte ne s'enroulera pas. Il développe simplement la colonne pour l'adapter au texte. Si je définis la largeur à un montant fixe sur la dernière colonne, l'encapsulation fonctionne comme prévu. Le problème est que si l'utilisateur élargit la fenêtre, la colonne reste à une taille fixe. Comment puis-je obtenir la taille dynamique de la colonne avec la largeur de la grille, mais toujours envelopper le texte à l'intérieur?

Répondre

-1

pour la largeur à « * »

5

Une largeur de "*" se partageront tout l'espace restant à parts égales entre les colonnes à l'aide "*". Si vous avez une seule colonne avec Width="*", cette colonne recevra tout l'espace restant. Si vous avez 2 colonnes avec Width="*", chacune recevra la moitié de l'espace restant.

Voici un good article on grid sizing qui inclut le dimensionnement des étoiles.

1

Essayez ceci:

<Grid Margin="0,5,0,0"> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="50"></ColumnDefinition> 
    <ColumnDefinition Width="50"></ColumnDefinition> 
    <ColumnDefinition Width="48"></ColumnDefinition> 
    <ColumnDefinition Name="ParentColumn" Width="Auto"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}" 
     MaxWidth="{Binding ActualWidth, ElementName=ParentColumn}"> 
-1

Vous devez utiliser Auto uniquement lorsque vous souhaitez colonne/ligne à la taille en fonction du contenu dans ladite colonne/ligne. Si vous voulez "asigner le reste de l'espace", utilisez "*". Dans votre cas, TextBlock doit connaître l'espace dont il dispose avant d'effectuer une mesure précise, afin de savoir où placer le texte.

5

Il ya un cas frustrant que j'ai découvert qui peut atteindre le seuil de rentabilité avec Width="*" et c'est quand vous avez IsSharedSizeScope= true.

<Border BorderBrush="Red" BorderThickness="1"> 
    <StackPanel Grid.IsSharedSizeScope="True"> 

     <Grid HorizontalAlignment="Stretch"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" SharedSizeGroup="G1"/> 
       <ColumnDefinition Width="Auto" SharedSizeGroup="G2" /> 
       <ColumnDefinition Width="*" SharedSizeGroup="G3" /> 
      </Grid.ColumnDefinitions> 

      <TextBlock Text="Col0" Grid.Column="0" Margin="0,0,5,0"/> 
      <TextBlock Text="Col1" Grid.Column="1" Margin="0,0,5,0"/> 

      <TextBlock Text="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" TextWrapping="Wrap" Grid.Column="2"/> 
     </Grid> 

    </StackPanel>     

</Border> 

Ce ne sera pas envelopper, mais si vous changez Grid.IsSharedScopeSize à false il fait.

N'a pas encore trouvé de solution, mais cela peut être une autre raison pour laquelle cela ne fonctionnera pas.

+0

Note: Une réponse supprimée en référence à ma réponse dit "Cela ne fonctionnera pas, parce que les colonnes de taille partagée ignorent la propriété Width et la considèrent comme Auto, donc vous obtenez la même configuration que Ben dans la question originale. " –