Question

Comment puis-je mettre en place un contrôle WPF pour remplir l'espace disponible dans le conteneur de son parent, mais pas élargir le parent?

L'extrait suivant décrit la mise en page que je tente. Je voudrais que le Grid d'étirer pour accueillir le Expander, et je voudrais le ListBox que pour remplir le Grid. Je veux la barre de défilement du ListBox apparaisse lorsque le Grid est trop petit pour montrer tous les ListBoxItems.

<ScrollViewer>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Grid.Column="0" />
        <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
    </Grid>
</ScrollViewer>

À l'heure actuelle ce qui se passe est que le Grid étend à occuper tout ListBox, et la barre de défilement verticale de la ScrollViewer externe apparaît. Je ne veux que la barre de défilement extérieure pour apparaître lorsque le Expander est trop grand pour s'adapter à l'écran.

Était-ce utile?

La solution

Pour résoudre le même problème que j'ai écrit classe conteneur spécial:

class FrugalContainer : Decorator
{
    protected override Size MeasureOverride(Size availableSize)
    {
        return new Size(0, 0);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        // get it all
        Child.Measure(arrangeSize);
        Child.Arrange(new Rect(arrangeSize));
        return Child.RenderSize;
    }
}

votre ListBox par Entourez le récipient et la hauteur de ListBox sera le même que celui de Expander.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <FrugalContainer Grid.Row="0" Grid.Column="0" >
        <ListBox />
    </FrugalContainer>
    <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>

Notez que je retire Width="Auto" de la définition de la colonne parce que le FrugalContainer sera aussi petit que possible. vous ne pouvez donc pas définir la largeur ou la hauteur de la cellule de la grille mère Auto.

Si vous avez besoin redimensionnement automatique, réécrire le conteneur:

class FrugalHeightContainer : Decorator
{
    protected override Size MeasureOverride(Size availableSize)
    {
        Child.Measure(availableSize);
        return new Size(Child.DesiredSize.Width, 0);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        Child.Measure(arrangeSize);
        Child.Arrange(new Rect(arrangeSize));
        return Child.RenderSize;
    }
}

Autres conseils

Quel est le point de la ScrollViewer? Il suffit de laisser le ScrollViewer dans le modèle de ListBox apparaissent naturellement trop peu de place est disponible.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <ListBox Grid.Row="0" Grid.Column="0" />
    <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top