2009-08-21 21 views
2

Wie kann ich ein WPF-Steuerelement einrichten, um den verfügbaren Speicherplatz im übergeordneten Container zu füllen, aber nicht das übergeordnete Element zu erweitern?Festlegen eines WPF-Steuerelements zum Erweitern, um den verfügbaren Speicherplatz zu füllen, und nicht mehr

Das folgende Snippet beschreibt das Layout, das ich versuche. Ich möchte die Grid dehnen, um die Expander aufzunehmen, und ich möchte die ListBox nur die Grid füllen. Ich möchte, dass die Bildlaufleiste ListBox erscheint, wenn die Grid zu klein ist, um alle ListBoxItem s anzuzeigen.

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

Zeit, was passiert, ist, dass die Grid erstreckt sich die gesamte ListBox und die äußeren ScrollViewer ‚s vertikale Bildlaufleiste angezeigt passen. Ich möchte nur die äußere Bildlaufleiste erscheinen, wenn die Expander zu groß wird, um auf dem Bildschirm zu passen.

Antwort

3

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; 
    } 
} 

Ihre ListBox Surround 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> 

Bitte beachte, dass ich Width="Auto" aus Spalte Definition entfernen, da der FrugalContainer so klein sein wird, wie er kann. Daher können Sie die Breite oder Höhe der Zelle des übergeordneten Rasters nicht auf "Automatisch" festlegen.

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; 
    } 
} 
+0

Genau das, was ich gesucht habe –

+0

Ich fühle mich ein bisschen dumm fragen, aber wo Sie diese benutzerdefinierte Dekorateur Klasse? Ich lege es in den App-Stammordner und es erscheint nicht als Option in Xaml. – Tyrsius

0

Was ist der Sinn der ScrollViewer? Lassen Sie einfach die ScrollViewer in der Vorlage ListBox erscheinen natürlich, wenn zu wenig Platz verfügbar ist.

<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> 
+0

Die äußere Scroll-Viewer ist für, wenn der * Expander * ist zu groß auf dem Bildschirm zu passen. –

+0

Was ist der Inhalt des Expanders? Dort sollten Sie sicherstellen, dass ein ScrollViewer vorhanden ist. –

+0

Ich möchte das gesamte UserControl scrollen, einschließlich einiger Inhalte, die hier nicht enthalten sind, so dass ich den 'ScrollViewer' nicht um den' Expander' herum bewegen kann. –