Im folgenden Beispiel habe ich eine ListBox mit Dutzenden 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 es funktioniert nicht.
Also habe ich einen "ScrollViewer" hinzugefügt, der rechts einen "Scrollbar-Bereich" darstellt. Im Scrollbar-Bereich befindet sich jedoch keine Scrollleiste, sodass Sie scrollen können (!).
Warum ist eine Bildlaufleiste nicht automatisch und wie zwinge ich eine Bildlaufleiste dazu?
<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>
Das Problem bei Ihrer Lösung ist, dass Sie eine Bildlaufleiste um eine ListBox legen, an der Sie sie wahrscheinlich in die ListBox einfügen möchten.
Wenn Sie in Ihrer ListBox eine Bildlaufleiste erzwingen möchten, verwenden Sie die angefügte Eigenschaft ScrollBar.VerticalScrollBarVisibility.
<ListBox
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
Wenn Sie diesen Wert auf Auto setzen, wird nach Bedarf die Bildlaufleiste eingeblendet.
ListBox
enthält bereits ScrollViewer
. Standardmäßig wird ScrollBar
angezeigt, wenn mehr Inhalt als Leerzeichen vorhanden ist. Einige Container ändern sich jedoch selbst, um sich an ihren Inhalt anzupassen (z. B. StackPanel
), sodass es niemals "mehr Inhalt als Platz" gibt. In solchen Fällen wird der Variablen ListBox
immer so viel Platz gegeben, wie für den Inhalt benötigt wird.
Um die Bedingung zu berechnen, dass mehr Inhalt als Leerzeichen vorhanden ist, muss die Größe bekannt sein. Stellen Sie sicher, dass Ihre ListBox
eine eingeschränkte Größe hat, indem Sie die Größe explizit im ListBox
-Element selbst oder im Host-Bedienfeld festlegen.
Wenn das Host-Bedienfeld vertikal StackPanel
ist und Sie VerticalScrollBar
möchten, müssen Sie die Höhe auf ListBox
selbst einstellen. Für andere Arten von Behältern, z. Grid
kann die ListBox
vom Container eingeschränkt werden. Sie können beispielsweise Ihren ursprünglichen Code so ändern, dass er wie folgt aussieht:
<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 nicht nur der unmittelbare Container wichtig ist. In Ihrem Beispiel ist der unmittelbare Container eine Grid
, aber da diese Grid
in einer StackPanel
enthalten ist, wird die äußere StackPanel
erweitert, um ihr unmittelbares untergeordnetes Grid
unterzubringen, sodass dieses untergeordnet werden kann, um its child aufzunehmen (die ListBox
). ).
Wenn Sie die Höhe an einem beliebigen Punkt festlegen, indem Sie die Höhe der Variablen ListBox
festlegen, indem Sie die Höhe der inneren Variable Grid
einstellen oder einfach den äußeren Container als Grid
festlegen, wird automatisch eine vertikale Bildlaufleiste angezeigt, wenn zu viele vorhanden sind Listenelemente, die in das Steuerelement passen.
Ich fügte meiner ListBox eine "Höhe" hinzu und fügte die Bildlaufleiste hinzu.
Die Bildlaufleiste wird automatisch zum Listenfeld hinzugefügt, sofern die Sichtbarkeit nicht auf Ausgeblendet eingestellt ist. Immer wenn die Größe von Listenelementen die Größe überschreitet, die in einem Listenfeld angezeigt werden kann, können vertikale oder horizontale Listenfelder während der Laufzeit angezeigt werden.
In meinem Fall ist die Anzahl der Elemente in der ListBox dynamisch, daher wollte ich die Height-Eigenschaft nicht verwenden. Ich habe stattdessen MaxHeight verwendet und es funktioniert gut. Die Bildlaufleiste wird angezeigt, wenn sie den Platz belegt, den ich dafür zugewiesen habe.
XAML ListBox Scroller - Windows 10 (UWP)
<Style TargetType="ListBox">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>
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 löste dies, indem ich die beiden stattdessen in ein DockPanel steckte. Ich setze die ComboBox DockPanel.Dock = "Top" und lasse die ListBox den verbleibenden Speicherplatz füllen.