Définition d'un contrôle WPF pour étendre pour remplir l'espace disponible, et plus
-
19-09-2019 - |
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 ListBoxItem
s.
<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.
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>