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 ListBoxItems 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.

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top