Question

J'ai un contrôle xaml simple avec la définition suivante de la grille:

<Grid.RowDefinitions>
            <RowDefinition Height="15*" />
            <RowDefinition Height="60*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="15*" />
</Grid.RowDefinitions>

Les lignes 1 à 3 contiennent chacune un bloc de texte contenant ou non du texte. Dans le code, je veux minimiser RowDefinition s'il n'y a pas de texte. J'ai essentiellement dans mon code derrière:

if(textblock.Text != ""){
   grid.RowDefinitions[elementRow].Height = new GridLength(20, GridUnitType.Star);
}
else{
   grid.RowDefinitions[elementRow].Height = new GridLength(0, GridUnitType.Star);
}

Je veux que les rangées 0 et 4 restent telles qu'elles sont définies dans le xaml. Malheureusement, cela ne fonctionne pas même s'il y a du texte dans le bloc de texte à la ligne 2, rien ne s'affiche.

Est-ce que je fais quelque chose de mal?

Toute aide est appréciée,

James

Était-ce utile?

La solution

N'utilisez pas la notation en étoile, utilisez Auto pour vos RowDefinitions. Si TextBlock.Text est vide, définissez la visibilité du TextBlock sur Visibility.Collapsed. La ligne de la grille sera alors automatiquement réduite à zéro.

Autres conseils

Ce n'est pas la réponse à votre question, mais quelques informations.

Le * dans la hauteur (ou la largeur des colonnes) signifie que la rangée (ou la colonne) largeur: Height = "*". (ou Width = "*") occupera le reste de l’espace. Donc, si vous avez une grille de 4 lignes dans une grille avec une hauteur = "100", si vous procédez ainsi:

<Grid.RowDefinitions>
            <RowDefinition Height="10" />
            <RowDefinition Height="10" />
            <RowDefinition Height="10" />
            <RowDefinition Height="*" />
</Grid.RowDefinitions>

La largeur de la ligne Height = " * " 70 DIU (unités indépendantes de l’appareil).

L'ajout d'un nombre avant l'astérisque (Height = "2 *") ne fonctionne que s'il y a plus d'une ligne utilisant l'astérisque, le nombre avant l'astérisque indique combien d'espace supplémentaire occupera cette ligne spécifique (2 * = deux fois plus, 3 * trois fois plus, etc. ...). I. E.:

<Grid.RowDefinitions>
            <RowDefinition Height="10" />
            <RowDefinition Height="10" />
            <RowDefinition Height="2*" /> <!-- this row will be twice as tall as the one below -->
            <RowDefinition Height="*" />
</Grid.RowDefinitions>

Ici, la 3ème rangée aura une hauteur de 54 DIU (deux fois plus que la 4ème rangée, qui a une hauteur d'environ 26 DIU), les deux hauteurs totalisent 80, ce qui correspond au reste de l'espace de la grille (10 + 10 + 26 + 54 = 100, la hauteur de la grille).

BTW, je suis d'accord avec la réponse de Charlie.

Vous pouvez placer vos éléments dans un UniformGrid avec Columns = " 1 " Et réduisez la visibilité de la zone de texte lorsque vous recevez du texte emptry.

 <UniformGrid Columns="1">
    <TextBlock Text="AAAA" Visibility="Collapsed" Grid.Row="0"/>
    <TextBlock Text="BBBBB" Grid.Row="1"/>
    <TextBlock Text="CCCCC" Grid.Row="2"/>
    <TextBlock Text="DDDDD" Grid.Row="3"/>
    <TextBlock Text="EEEE" Grid.Row="4"/>
</UniformGrid>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top