Frage

habe ich versucht, den Vorschlag hier Stretching in Bezug auf, aber es hat für mich nicht.

Ich habe eine TabItem, dass Hosts ein Benutzersteuerelement, das im Wesentlichen mit einem Itemspanel nur eine List-Box ist. Die Itemspanel zwingt die List-Box, um seinen Inhalt horizontal angezeigt werden soll. Der Inhalt des ListBox sind Databound zu einem ObservableCollection<StackPanelContents>, die ein anderes Benutzersteuerelement ist. StackPanelContents selbst im Grunde enthält nur eine List von Objekten mit einiger visuellen Darstellung (sie eine UIElement für die Visualisierung enthalten).

In der Regel funktioniert der Code richtig, dass es alle Daten macht, dass ich in der ObservableCollection enthalten haben, aber das Problem ist, dass die Elemente die Größe nicht, wenn das Fenster vergrößert oder geschrumpfte.

Hier ist ein Überblick über die Klassenhierarchie sieht aus wie:

alt text

Und hier sind die Ergebnisse:

alt text

Die XAML für das Hauptfenster hat gerade die TabControl und TabItem:

<Window x:Class="ResizeStackPanelInListBox.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <TabControl>
        <TabItem Header="Test" x:Name="MyTabItem">
            <!-- contents are set in code behind -->
        </TabItem>
    </TabControl>
</Window>

Die ListBoxContainer XAML, dass zeigt die StackPanelContents sieht wie folgt aus:

<UserControl x:Class="ResizeStackPanelInListBox.ListBoxContainer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock>ListBox with StackPanels as its ListBoxItems:</TextBlock>
        <ListBox Grid.Row="1" ItemsSource="{Binding StackPanels}" HorizontalContentAlignment="Stretch">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Width="Auto" Height="Auto" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid>
</UserControl>

Und die StackPanelContents Usercontrol sieht wie folgt aus:

<UserControl x:Class="ResizeStackPanelInListBox.StackPanelContents"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">

    <StackPanel>
        <TextBlock Text="StackPanel"></TextBlock>
        <StackPanel x:Name="MyStackPanel">
        </StackPanel>
    </StackPanel>
</UserControl>

erklären kann jemand, warum dies nicht automatisch ist, Ändern der Größe, und wie kann ich gehen diese zu lösen? Bin ich zu haben, meine eigene benutzerdefinierte Platte zu schreiben, um damit umzugehen, und die Verwendung MeasureOverride und Arrange?

War es hilfreich?

Lösung

Das Problem ist, dass Sie StackPanels verwenden Elemente in beiden Richtungen anzuordnen, so dass Sie jede Art von Strecken zu verlieren. Stackpanel ermöglicht es seinen Kindern gegenüber der Ausrichtung nur in der Richtung zu strecken. Die andere Richtung wird nur so viel Raum gegeben werden, wie es braucht, um den Rest der Elemente so viel Platz wie möglich zu ermöglichen. Also für einen Standard-Vertikale Stackpanel etwas setzen Sie innen wird vertikal horizontal, sondern Squeeze nach oben hin strecken. Da Sie Vertical StackPanels in einem Horizontal Stackpanel Sie sind Elemente werden in beiden Richtungen zusammengedrückt zu werden.

Es gibt ein paar Optionen, je nachdem, was Sie wollen Ihre Artikel zu tun. Der Wechsel zu einem DockPanel wird das letzte Element ermöglichen, den Raum (das vertikal man braucht DockPanel.Dock = Top im ItemContainerStyle eingestellt) zu dehnen und zu füllen. Ein Gitter mit * Größe von Zeilen und Spalten funktioniert gut für normale Layouts, aber nicht im Fall von ItemsControls seit der Zeile und Spalte Notwendigkeit, für jedes Element eingestellt wird (es mit ItemsControl.AlternationIndex getan werden kann, aber es ist ein Schmerz und zerbrechlich). Unter Verwendung einer 1 Zeile / Spalte Uniform (wie in der Antwort, die Sie verwiesen) wird die zur Verfügung stehende Raum gleichmäßig aufteilen und erfordert keine zusätzlichen Einstellungen für die Elemente.

Wenn Sie etwas komplexere Layout-Strategie mit verschiedenen Einzelteilen unterschiedlich viel Platz bekommen oder Verhalten Stretching Sie eine benutzerdefinierte Panels benötigen.

Andere Tipps

versucht Satz in Fenstern

    SizeToContent="WidthAndHeight"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top