Laden...

Listbox im StackPanel: kein Scrollbalken

Erstellt von bb1898 vor 9 Jahren Letzter Beitrag vor 9 Jahren 767 Views
B
bb1898 Themenstarter:in
112 Beiträge seit 2008
vor 9 Jahren
Listbox im StackPanel: kein Scrollbalken

Dieses Fenster tut nicht, wie es soll (und ja, diese Aussage werde ich weiter unten präzisieren):

<Window x:Class="Listen_Layout.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <StackPanel>
            <TextBlock Margin="10,5">Im StackPanel</TextBlock>
            <Border BorderBrush="DarkBlue" BorderThickness="3" Margin="10,5">
                <ListBox ItemsSource="{Binding AlleZeilen}" />
            </Border>
            <TextBlock Margin="10,5">Im StackPanel, Ende</TextBlock>
        </StackPanel>
        <DockPanel Grid.Column="1">
            <TextBlock DockPanel.Dock="Bottom" Margin="10,5">Im DockPanel, Ende</TextBlock>
            <TextBlock DockPanel.Dock="Top" Margin="10,5">Im DockPanel</TextBlock>
            <Border DockPanel.Dock="Top" BorderBrush="DarkRed" BorderThickness="3" Margin="10,5">
                <ListBox ItemsSource="{Binding AlleZeilen}" />
            </Border>
        </DockPanel>
    </Grid>
</Window>

Der Vollständigkeit halber noch die Klasse, aus der die Listen gefüllt werden:

class Listen_Daten
    {
        public ObservableCollection<string> AlleZeilen { get; private set; }

        public Listen_Daten()
        {
            AlleZeilen = new ObservableCollection<string>();
            for (int i = 1; i < 50; i++)
            {
                AlleZeilen.Add(String.Format("Listenelement Nr. {0}", i));
            }
        }
    }

Eine Instanz dieser Klasse bildet den DataContext für das Fenster.

Im DockPanel (rechte Fensterhälfte) sieht alles aus, wie es soll: Text oben, dann die Listbox mit einem vertikalen Scrollbalken, schön rot eingerahmt, Text unten.

Im StackPanel (linke Fensterhälfte) wird die Liste unvollständig angezeigt, ohne Scrollbalken, auch vom blauen Rahmen fehlt der untere Rand und der untere Text ist auch nicht da. Geht man mit der Cursortaste nach unten durch die Liste, sieht man nicht mehr, welcher Eintrag selektiert ist. Man kann das alles durch Vergrößern des Fensters herschaffen, aber das ist nicht der Witz von WPF.

Mein eigentliches Problem dabei: ich habe ein paar StackOverflow-Threads gefunden, in denen für solche Fälle zu einem anderen Layout-Container geraten wird. Ich habe aber nicht gefunden, wo in der Dokumentation diese Einschränkung des StackPanels beschrieben wird. Kann mir das jemand sagen?

Danke!

W
113 Beiträge seit 2006
vor 9 Jahren

Hallo bb1898,

ein StackPanel ist immer so groß wie sein Inhalt. Da die ListBox verwendet intern ein ItemControl welches sich wie ein StackPanel verhält. Somit sieht es für die ListBox so aus als ob genügend Platz vorhanden ist und es werden keine ScrollBars angezeigt.

Ich kann ebenso wie du auch schon geschrieben hast nur empfehlen ein anderes Container Control zu verwenden.

In deinem Fall würde ich das so machen:


<Grid>
	<Grid.ColumnDefinitions>	
		<ColumnDefinition />
		<ColumnDefinition />
	</Grid.ColumnDefinitions>
	<Grid.RowDefinitions>
		<RowDefinition Height="Auto" />
		<RowDefinition Height="*" />
		<RowDefinition Height="Auto" />
	</Grid.RowDefinitions>
   
	<TextBlock Grid.Row="0" Margin="10,5">Im StackPanel</TextBlock>	
	<Border Grid.Row="1" BorderBrush="DarkBlue" BorderThickness="3" Margin="10,5">
		<ListBox ItemsSource="{Binding AlleZeilen}" />
	</Border>	
	<TextBlock Grid.Row="2" Margin="10,5">Im StackPanel, Ende</TextBlock>
	
	
	<DockPanel Grid.Column="1" Grid.RowSpan="3">
		<TextBlock DockPanel.Dock="Bottom" Margin="10,5">Im DockPanel, Ende</TextBlock>
		<TextBlock DockPanel.Dock="Top" Margin="10,5">Im DockPanel</TextBlock>
		<Border DockPanel.Dock="Top" BorderBrush="DarkRed" BorderThickness="3" Margin="10,5">
			<ListBox ItemsSource="{Binding AlleZeilen}" />
		</Border>
	</DockPanel>
</Grid>

Gruß,
Xan

B
bb1898 Themenstarter:in
112 Beiträge seit 2008
vor 9 Jahren

Hallo bb1898,

ein StackPanel ist immer so groß wie sein Inhalt. Da die ListBox verwendet intern ein ItemControl welches sich wie ein StackPanel verhält. Somit sieht es für die ListBox so aus als ob genügend Platz vorhanden ist und es werden keine ScrollBars angezeigt.

Das ist eine einleuchtende Erklärung, danke. Genau so etwas müsste aber doch auch in der offiziellen Dokumentation stehen. Fehlt es oder habe ich es bloß nicht gefunden oder evtl. eine vorhandene Erklärung nicht verstanden? Ich habe in der Zwischenzeit auch in drei verschiedenen WPF-Büchern nachgesehen, ebenso erfolglos.

5.658 Beiträge seit 2006
vor 9 Jahren

Hi bb1898,

die ersten Ergebnisse einer schnellen Google-Suche:

Introduction to WPF Layout
Layout
Panels Overview

Bitte beachte auch unseren [Hinweis] Wie poste ich richtig?, Punkt 1.

Christian

Weeks of programming can save you hours of planning