2009-11-09 7 views
7

Ich versuche, die vertikale Strecke zu arbeiten, wie erwartet ich WPF, aber aus irgendeinem Grund braucht es nur den Raum, den es benötigt, und nicht den verfügbaren Platz.WPF, vertikales Strecken funktioniert wie erwartet!

Zuerst verwende ich WPF mit C# und Prism.

In der Shell.xaml (Haupt xaml für die Anwendung) habe ich ein Raster mit 2 Spalten und einer Zeile. Die Idee ist, eine Seitenwand und einen Haupt-App-Bereich zu haben. Das Haupt-App-Bereichsraster ist auf Auto Width und Auto Height eingestellt. Dies funktioniert wie erwartet, und es skaliert, um die gesamte Anwendung in Höhe und Breite anzupassen.

Dann verwende ich Prisma, um die Ansicht (als UserControl-Komponente) in den Haupt-App-Bereich einzufügen. Das UserControl wird auch auf Auto Width und Height festgelegt, und die HorizontalAlignment und die VerticalAlignment werden auf die Standardeinstellungen in Expression Blend festgelegt, um zu strecken!

Das prisma geladene UserControl erstreckt sich jedoch nur in der Breite und nicht in der Höhe! Indem ich eine Hintergrundfarbe für visuelles Feedback gebe, kann ich sehen, dass es nur den vertikalen Raum benötigt, und nicht die gesamte verfügbare Fläche!

Was könnte die Lösung dafür sein? Ich habe versucht, alle Einstellungen zu durchlaufen und sie manuell zu Width und Height Auto, Horizontal und Vertical Alignment zu Stretch zu überschreiben, aber nichts scheint zu funktionieren wie erwartet!

Einige Code: (Shell.xaml)

<Window Height="1140" Width="1450"> 
    <Grid Margin="0" Background="White"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="250" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Grid Background="#FFEEEEEE" Grid.Column="0" Grid.Row="0"> 
      </Grid>   
      <ItemsControl Width="Auto" Height="Auto" Grid.Row="0" Grid.Column="1" Name="MainRegion" cal:RegionManager.RegionName="MainRegion" Padding="10" Margin="10, 0, 0, 0" Background="#FFFFFFD5" /> 
     </Grid> 
    </Grid> 
</Window> 

(Ansicht, die die Mutterhöhe erben sollte):

<UserControl Width="Auto" Height="Auto" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <!-- I want this to take the full width and height of the parent --> 
</UserControl> 

in der Art und Weise Das ist also eine Verjährungsfrist die Ansichten in geladen werden Das Haupt-Xaml, oder ist das eine UserControl-Einschränkung oder etwas anderes, das ich nicht verstehe?

Nur um zu klären; Ich sehe die Hintergrundfarbe von ItemsControl, die in Shell.xaml definiert ist und sowohl Horizontal als auch Vertikal dehnt, aber nicht den Hintergrund der in ItemsControl geladenen Ansicht.

Beachten Sie, dass ich einige der XAML entfernt habe, um den Punkt leichter zu verstehen!

Danke!

Antwort

8

Ich fand eine Lösung. Ich habe die Itemspanel-Vorlage außer Kraft setzen ein Gitter (oder einem ähnlichen Behälter) zu verwenden:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Grid/> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Ich habe auch in diesem Fall einen Teil der XAML entfernt, um es readble zu machen!

Dank

+0

Sie können dies als die Antwort markieren. –

+0

ja, an einem Tag, da es meine eigene Antwort ist –

+0

Wenn Sie nur ein Element zeigen, warum nicht ein ContentControl anstelle eines ItemsControl verwenden. Angenommen, Sie legen nicht absichtlich mehrere Gegenstände übereinander. – jpierson

1

Haben Sie versucht, HorizontalContentAlignment und VerticalContentAlignment auf Stretch in ItemsControl zu setzen?

+0

Ja, ich habe aber keinen Unterschied:

Wenn Sie die mehrere Ansichten vertikal zu bevorzugen stapeln, wie sie mit Stackpanel haben, werden Sie, dass bis in ItemContainerStyle gesetzt haben! Stretch ist der Standardwert für HorizontalContentAlignment und VerticalContentAlignment im ItemsControl, aber ich habe auch versucht, beide mit dem vaule Stretch zu überschreiben! –

+2

Ich würde auch die Autos loswerden; Ausrichtungen sollten Breite und Höhe festlegen. Haben Sie zur Laufzeit Ihren visuellen Baum mit Mole oder einem der WPF-Snoops überprüft? – Will

+0

Ich werde in Mole oder etwas Ähnliches schauen, da sie in Fällen wie diesem eine großartige Unterstützung sein können! –

10

Der Standard für ItemsControl.ItemsPanelTemplateStackPanel ist, die sich vertikal um die Symptome zu geben alle ihre Kinder komprimiert Sie beschreiben.

Die Lösung code-zoop gab Änderungen an <Grid>. Dies funktioniert gut, solange es nur eine Ansicht in der Region gibt.Aber wenn die Region mehr als eine Aussicht hat, werden sie alle aufeinander und nicht nebeneinander gelegt.

Wenn Sie eine Region möchten, die mehrere Ansichten umgehen können, aber erlauben Blick auf die volle Größe des Bereichs zu dehnen, verwenden Sie eine DockPanel statt:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <DockPanel /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Dies wird die erste Ansicht in einem Panel auf der PUT linke Seite, die nächste daneben, und so weiter bis zur letzten Ansicht, die den ganzen verbleibenden Raum ausfüllen wird.

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <DockPanel /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
    <Style> 
     <Setter Property="DockPanel.Dock" Value="Top" /> 
    </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 
+0

Danke für diese tolle Info! Ich werde evaluieren müssen, welche Art und Komponente in der ITemsControl verwendet werden soll, aber für den Moment verwende ich ein Grid und im UserControl verwende ich ein DockPanel. Auf diese Weise denke ich, dass das UserControl eine höhere Kontrolle über sein eigenes Layout hat, aber dies hängt von der Notwendigkeit ab. Danke Ray –

+0

@Will - PERFEKT Ich habe versucht, dies für zwei Tage zu lösen. @ code-zoop sollte dies als Antwort markieren. Zum Glück dachte ich, dass ich zurückkommen und weiterlesen würde, nachdem ich seine Antwort umgesetzt hatte und das Problem hatte, das Sie gerade angesprochen hatten. Immer noch bin ich mächtig froh, dass Code-Zoop die Frage gestellt hat. – Tod