8
votes

Comment effondrer une rowdefinition?

J'ai besoin de retirer l'espace occupé par une grille.row. Je suis capable de s'effondrer (supprimer) le contrôle que j'ai placé dans Grid.row, mais puisque RowDefinition a une taille fixe (hauteur) même après avoir retiré le contrôle de l'enfant, je peux toujours voir une rangée vide.

Y a-t-il un moyen d'effondrer une rowdefinition / grille.row?

Merci pour votre intérêt.


1 commentaires

6 Réponses :


1
votes

Vous pouvez voir ici un exemple de manipulation de lignes et de colonnes dans une grille. Même si la documentation est pour .NET (WPF), il est toujours pertinent pour WP7 / Silverlight.

Je penserai personnellement à deux fois avant d'utiliser une grille de cette manière. Peut-être que tout ce que vous essayez peut être atteint à l'aide d'un StackPanel ou de tout autre des commandes de conteneurs de la boîte.


1 commentaires

Juste pour la fin, j'ai utilisé grid.rowdefinitions.removeat (index). Je conviens que la mise en place d'un StackPanel pourrait être une meilleure option pour ce scénario.



9
votes

Vous auriez pu définir rowdefinition.height = "auto" et aurait pu assigner une hauteur fixe au visuel réel de cette rangée. De cette façon, lorsque le visuel est visiblement collé, la ligne n'occupe pas la largeur fixe attribuée à la défense de la ligne.


1 commentaires

C'est la réponse simple à la question. Merci!. Je sais que c'est très vieux, mais vous avez fait une petite typo, écrit une largeur lorsque vous vouliez avoir une hauteur.



6
votes

réglage rowdefinition.height = "auto" code> ne convient pas à tous les cas, comme souvent, nous voulons * dimensionner de nos lignes.

Ajout de manière dynamique / élimination de la liste de la liste Il est plus facile et plus sûr d'étirer le contenu des premières lignes sur la ligne suivante / s. p>

Ceci peut être effectué à l'aide d'un Datriggigrigment pour définir la grille.rowspan sur le premier élément de la grille. Vous trouverez ci-dessous un exemple complet - juste la coller dans une nouvelle fenêtre WPF pour la voir en action. P>

  <Grid>
        <Grid.Resources>

            <BooleanToVisibilityConverter x:Key="visConverter"></BooleanToVisibilityConverter>
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <Grid Grid.Row="0" Background="Orange">
            <Grid.Style>
                <Style TargetType="Grid">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=toggle1, Path=IsChecked}" Value="False">
                            <Setter Property="Grid.RowSpan" Value="3"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Grid.Style>
        </Grid>
        <GridSplitter Grid.Row="1" ResizeBehavior="PreviousAndNext" HorizontalAlignment="Stretch" Height="3" 
                      Visibility="{Binding ElementName=toggle1, Path=IsChecked, Converter={StaticResource visConverter}}"></GridSplitter>
        <Grid Name="bottomGrid" Grid.Row="2" Background="LightBlue" 
              Visibility="{Binding ElementName=toggle1, Path=IsChecked, Converter={StaticResource visConverter}}">
        </Grid>
        <ToggleButton Name="toggle1" VerticalAlignment="Top">Hide/Show</ToggleButton>
</Grid>


0 commentaires

1
votes

Définir nom code> pour votre grille d'abord. Initialement, définissez les hauteurs de la ligne via l'attribut XAML: xxx pré>

Lorsque vous souhaitez effondrer un rowdefinition code>: p> xxx pré>

Lorsque vous souhaitez le rendre visible à nouveau: P>

A.Visibility = Visibility.Visible;
GridSize.RowDefinitions[0].Height = new GridLength(3, GridUnitType.Star);


1 commentaires

C'est une façon très non-MVVM de le faire, juste pour le compte rendu.



4
votes

Il est absolument correct d'appliquer un style avec des déclencheurs à votre RowDefinition pour la ligne que vous souhaitez effondrer. Cela peut vous aider lorsque vous avez des valeurs étoiles pour vos hauteurs.

Ce qui suit pourrait être utile si vous souhaitez masquer une section de résultats avant que les résultats n'existaient (c.-à-d. Un Observablecollection ), par exemple. xxx


0 commentaires

0
votes

Une solution simple (utilisez la hauteur que vous connaissez que vos commandes se développeront): xxx

puis assurez-vous que toutes les commandes à l'intérieur de cette ligne utiliseront visibilitty = "effondré"

Cela a fonctionné pour moi, car je n'ai besoin que de définir le drapeau pour effondrer / visible une seule fois, je ne sais pas comment cela fonctionnera si vous souhaitez basculer la visibilité au moment de l'exécution.


0 commentaires