Festlegen ein WPF-Steuerelement zu erweitern verfügbaren Raum zu füllen, und nicht mehr
-
19-09-2019 - |
Frage
Wie kann ich ein WPF-Steuerelement einrichten den verfügbaren Platz in seinen Eltern Behälter zu füllen, aber nicht die Eltern erweitern?
Der folgende Ausschnitt beschreibt das Layout ich versucht bin. Ich möchte die Grid
strecken, um den Expander
gerecht zu werden, und ich möchte nur die ListBox
die Grid
füllen. Ich möchte die Bildlaufleiste ListBox
erscheinen, wenn der Grid
zu klein ist, um alle ListBoxItem
s zu zeigen.
<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>
Zur Zeit, was passiert, ist, dass die Grid
die gesamte ListBox
passen erstreckt, und die vertikale Bildlaufleiste des äußeren ScrollViewer
erscheint. Ich möchte nur die äußere Bildlaufleiste angezeigt werden, wenn die Expander
zu groß wird auf dem Bildschirm zu passen.
Lösung
das gleiche Problem zu lösen, ich spezielle Container-Klasse schrieb:
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;
}
}
Umgeben Sie Ihre List-Box durch den Behälter und die Höhe der List-Box wird das gleiche wie der Expanders sein.
<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>
Beachten Sie, dass ich Width="Auto"
aus Spalte Definition entfernen, da der FrugalContainer so klein sein wird, wie er kann. So können Sie nicht setzen Sie die Breite oder Höhe der Zelle des Mutter Gitter auf Auto.
Wenn Sie das automatische Anpassen benötigen, schreiben Sie den Container:
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;
}
}
Andere Tipps
Was ist der Sinn des ScrollViewer
? Lassen Sie die ScrollViewer
in der ListBox
Vorlage natürlich erscheinen, wenn zu wenig Platz zur Verfügung steht.
<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>