Wie kann ich eine vertikale Bildlaufleiste in meiner List-Box bekommen?
-
19-08-2019 - |
Frage
Im Beispiel unten ich eine List-Box mit Dutzenden von Font-Namen in ihm habe.
Ich habe gedacht, es automatisch eine vertikale Bildlaufleiste auf mich haben würde, so dass Sie jede Schriftart auswählen können, nicht nur die ersten, die in der Liste, aber es funktioniert nicht.
So habe ich eine „Scroll“ und setzt einen „Scrollbar Bereich“ auf der rechten Seite, aber es gibt keine Scrollbalken in der Scrollbar Bereich, so dass Sie bewegen können (!).
Warum nicht eine Scrollbar automatisch und wie kann ich sie zwingen, eine Scrollbar zu haben?
<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>
Lösung
Das Problem mit Ihrer Lösung ist man um eine List-Box eine Scrollbar setzen ist, wo Sie es wahrscheinlich in der List-Box setzen wollen.
Wenn Sie eine Bildlaufleiste in Ihrer List-Box zwingen wollen, verwenden Sie die ScrollBar.VerticalScrollBarVisibility angefügten Eigenschaft.
<ListBox
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
Wenn dieser Wert auf Auto wird die Bildlaufleiste auf einer Bedarfsbasis Popup.
Andere Tipps
ListBox
enthält bereits ScrollViewer
. Standardmäßig wird die ScrollBar
angezeigt, wenn es mehr Inhalt als Platz vorhanden ist. Aber einige Container Größe ändern sich deren Inhalte aufzunehmen (z StackPanel
), so gibt es nie „mehr Inhalt als Raum“. In solchen Fällen wird die ListBox
immer so viel Raum gegeben wie für den Inhalt erforderlich ist.
Um die Bedingung zu berechnen von mehr Inhalt als Raum aufweisen, sollte die Größe bekannt sein. Stellen Sie sicher, dass Ihre ListBox
eine eingeschränkte Größe hat, entweder durch die Größe explizit auf dem ListBox
Elemente Einstellung selbst, oder vom Host-Panel.
Bei der Host-Panel ist vertikal StackPanel
und Sie wollen VerticalScrollBar
Sie die Höhe auf ListBox
selbst festlegen. Für andere Arten von Behältern, z.B. Grid
, die ListBox
kann durch den Behälter eingeschränkt werden. Zum Beispiel können Sie Ihren ursprünglichen Code ändern wie folgt aussehen:
<Grid Name="grid1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ListBox Grid.Row="0" Name="lstFonts" Margin="3"
ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
</Grid>
</Grid>
Beachten Sie, dass es nicht nur die unmittelbare Umschließung ist, was wichtig ist. In Ihrem Beispiel ist der unmittelbare Behälter ein Grid
, sondern weil das Grid
von einem StackPanel
enthalten ist, wird die äußereen StackPanel
erweitert sein unmittelbares Kind Grid
gerecht zu werden, so dass das Kind aufnehmen erweitern sein Kind (die ListBox
).
Wenn Sie die Höhe an jedem Punkt - reicher durch die Höhe der ListBox
Einstellung, indem die Höhe der inneren Grid
Einstellung oder einfach durch die äußeren Behälter ein Grid
machen - dann wird eine vertikale Bildlaufleiste erscheint automatisch jederzeit dort sind zu viele Listenelemente in der Kontrolle.
Ich habe eine „Höhe“ zu meiner ListBox und hinzugefügt schön die Scrollbar.
Bildlaufleiste wird auf das Listenfeld automatisch hinzugefügt, es sei denn, seine Sicht auf Verborgen eingestellt ist. Immer dann, wenn die Größe der Listenelemente übersteigt die eine, die in einem Listenfeld vertikales oder horizontales Listenfeld während der Laufzeit zu sehen ist angezeigt werden kann.
In meinem Fall ist die Anzahl der Elemente in der List-Box ist dynamisch, damit ich nicht die Height-Eigenschaft verwenden wollte. Früher habe ich MaxHeight statt und es funktioniert gut. Die Bildlaufleiste angezeigt, wenn sie den Raum füllt ich dafür zugewiesen haben.
Ich habe das gleiche Problem hatte ich eine ComboBox durch eine List-Box in einem Stackpanel und die Bildlaufleiste für die ListBox gefolgt war nicht auftauchen. Ich löste dies, indem stattdessen die beide in einer DockPanel setzen. Ich habe die ComboBox DockPanel.Dock = „Top“ und lassen Sie die List-Box den verbleibenden Raum füllen.
XAML ListBox Scroller - Microsoft Windows 10 (UWP)
<Style TargetType="ListBox">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>