Im folgenden Beispiel habe ich eine ListBox mit Dutzenden von Schriftnamen.
Ich hätte gedacht, dass es automatisch eine vertikale Bildlaufleiste gibt, so dass Sie JEDE Schriftart auswählen können, nicht nur die ersten in der Liste, aber nicht.
Also habe ich einen "ScrollViewer" hinzugefügt, der rechts einen "Bildlaufleistenbereich" einfügt, aber im Bildlaufleistenbereich befindet sich keine Bildlaufleiste, sodass Sie scrollen können (!).
Warum ist eine Bildlaufleiste nicht automatisch und wie erzwinge ich eine Bildlaufleiste?
<StackPanel Name="stack1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ScrollViewer>
<ListBox Grid.Row="0" Name="lstFonts" Margin="3" ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
</ScrollViewer>
</Grid>
</StackPanel>
quelle
ListBox
Innere eingelegtScrollViewer
und dieListBoxItems
dehnten sich so weit, wie sie wollten, außerhalb der Größe desListBox
. Entfernen derScrollViewer
und EinstellungScrollViewer.VerticalScrollBarVisibility="Visible"
undScrollViewer.HorizontalScrollBarVisibility="Disabled"
hat den Trick gemacht. Danke für Ihre Hilfe!ListBox
enthält bereitsScrollViewer
. Standardmäßig wird das angezeigtScrollBar
, wenn mehr Inhalt als Speicherplatz vorhanden ist. Einige Container ändern jedoch die Größe, um ihren Inhalt aufzunehmen (z. B.StackPanel
), sodass es nie "mehr Inhalt als Speicherplatz" gibt. In solchen Fällen wird demListBox
immer so viel Platz eingeräumt, wie für den Inhalt benötigt wird.Um die Bedingung zu berechnen, dass mehr Inhalt als Speicherplatz vorhanden ist, sollte die Größe bekannt sein.
ListBox
Stellen Sie sicher, dass Ihre Größe eingeschränkt ist, indem Sie die Größe entweder explizit für dasListBox
Element selbst oder über das Hostfenster festlegen.Wenn das Host-Panel vertikal ist
StackPanel
und Sie möchtenVerticalScrollBar
, müssen Sie die Höhe auf sichListBox
selbst einstellen . Für andere Arten von Behältern, zum BeispielGrid
, dieListBox
durch den Behälter eingeschränkt werden. Sie können beispielsweise Ihren ursprünglichen Code so ändern, dass er folgendermaßen aussieht:Beachten Sie, dass nicht nur der unmittelbare Container wichtig ist. In Ihrem Beispiel ist der unmittelbare Container a
Grid
, aber da dieserGrid
in a enthalten istStackPanel
, wird der äußere ContainerStackPanel
erweitert, um sein unmittelbares Kind aufzunehmenGrid
, sodass dieses Kind erweitert werden kann, um sein Kind (dasListBox
) aufzunehmen.Wenn Sie die Höhe an einem beliebigen Punkt einschränken - indem Sie die Höhe des
ListBox
, die Höhe des innerenGrid
oder einfach den äußeren ContainerGrid
festlegen -, wird automatisch eine vertikale Bildlaufleiste angezeigt, wenn zu viele Listenelemente vorhanden sind in die Steuerung passen.quelle
StackPanel
in,Grid
da StackPanel immer auf die Höhe seiner untergeordneten Elemente erweitert wird.Ich habe meiner ListBox eine "Höhe" hinzugefügt und die Bildlaufleiste wurde schön hinzugefügt.
quelle
Die Bildlaufleiste wird automatisch zum Listenfeld hinzugefügt, es sei denn, die Sichtbarkeit ist auf Versteckt eingestellt. Immer wenn die Größe von Listenelementen die überschreitet, die in einem Listenfeld angezeigt werden kann, wird während der Laufzeit ein vertikales oder horizontales Listenfeld angezeigt.
quelle
In meinem Fall ist die Anzahl der Elemente in der ListBox dynamisch, sodass ich die Height-Eigenschaft nicht verwenden wollte. Ich habe stattdessen MaxHeight verwendet und es funktioniert gut. Die Bildlaufleiste wird angezeigt, wenn sie den dafür vorgesehenen Platz ausfüllt.
quelle
Ich hatte das gleiche Problem, ich hatte eine ComboBox gefolgt von einer ListBox in einem StackPanel und die Bildlaufleiste für die ListBox wurde nicht angezeigt. Ich habe dieses Problem gelöst, indem ich die beiden stattdessen in ein DockPanel gestellt habe. Ich setze die ComboBox DockPanel.Dock = "Top" und lasse die ListBox den verbleibenden Platz füllen.
quelle
XAML ListBox Scroller - Windows 10 (UWP)
quelle