Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Listbox im StackPanel: kein Scrollbalken
bb1898
myCSharp.de - Member



Dabei seit:
Beiträge: 110

Themenstarter:

Listbox im StackPanel: kein Scrollbalken

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
WarLorD_XaN
myCSharp.de - Member



Dabei seit:
Beiträge: 111
Herkunft: Austria

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
bb1898
myCSharp.de - Member



Dabei seit:
Beiträge: 110

Themenstarter:

beantworten | zitieren | melden

Zitat von WarLorD_XaN
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.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers