This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: WPF, Layouts und verschwundene Scrollleiste
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Ich habe auf meinem Fenster einige Elemente angeordnet. Darunter auch eine ListView. Diese hatte anfangs eine Scrollleiste, aber jetzt ist diese verschwunden? Warum?
Die Lösung
Diese und ähnliche Fragen werden sehr häufig gestellt. In den meisten Fällen liegt es daran, dass die verwendeten Layout-Elemente nicht gut genug bekannt sind und daher ein Fehlverhalten interpretiert wird, wo eigentlich gar keines ist.
Ein sehr verdächtiges Element ist in diesem Zuge das StackPanel. Es verändert seine Größe abhängig der eingebetteten Elemente.
Hier ein kleiner Beispielfall um dies näher zu beschreiben: Wir gehen davon aus, dass es ein StackPanel gibt. Dieses hat als Kindelement eine ListView. Letztere ist an eine Liste gebunden, welche einige hundert Elemente besitzt. Wird nun die Liste gebunden, vergrößert sich die ListView mit jedem Element das hinzugefügt wird. Bei einigen hundert Elementen kann man davon ausgehen, dass nicht mehr alle am Bildschirm angezeigt werden können und deswegen eine Scrollbar durchaus sehr sinnvoll wäre. Tatsächlich ist es nun so, dass sich das Elternelement, also das StackPanel, an die Größe der ListView anpasst und es somit gar nie notwendig wird, die Scrollbar anzuzeigen.
<DockPanelx:Name="ParentDock"Margin="8"LastChildFill="True"><StackPanelDockPanel.Dock="Top"><ButtonContent="Click me first"/><ButtonContent="Do not click me"/><ListViewx:Name="DemoBox"><ListView.View><GridView><GridViewColumn/><GridViewColumn/><GridViewColumn/></GridView></ListView.View></ListView></StackPanel></DockPanel>
In diesem Beispiel ist das StackPanel zwar in ein DockPanel eingebettet, verändert aber dennoch seine Größe, da der Inhalt wesentlich größer ist. So sieht es aus:
In diesem Fall muss auch gar nicht viel verändert werden. Damit die ListView zu ihrer Scrollbar kommt, ist diese lediglich aus dem StackPanel heraus zu nehmen:
<DockPanelx:Name="ParentDock"Margin="8"LastChildFill="True"><StackPanelDockPanel.Dock="Top"><ButtonContent="Click me first"/><ButtonContent="Do not click me"/></StackPanel><ListViewx:Name="DemoBox"><ListView.View><GridView><GridViewColumn/><GridViewColumn/><GridViewColumn/></GridView></ListView.View></ListView></DockPanel>
Damit ist nun das DockPanel für die ListView zuständig und beschränkt deren Größe. Dadurch wird die Scrollbar sichtbar. So siehts aus:
Fazit
Durch dieses Problem muss sich jeder durchkämpfen, der mit WPF beginnt. Die Verhaltensweisen sind unterschiedlich zu Windows Forms, in einigen Fällen ähnlich zu ASP.NET. Wichtig ist, sich mit den jeweiligen Layout-Elementen zu beschäftigen und zu lernen, wie sie mit Inhalten umgehen. Mit ein wenig Spielerei sollten dann zukünftig derartige Probleme vermieden werden können. Es warten ohnehin genug andere