web-dev-qa-db-de.com

Wie bekomme ich eine vertikale Bildlaufleiste in meiner ListBox?

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>
73
Edward Tanguay

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.

130
JaredPar

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.

24
yossharel

Ich fügte meiner ListBox eine "Höhe" hinzu und fügte die Bildlaufleiste hinzu.

16
Edward Tanguay

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.

3
Paras

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.

1
oldDavid

XAML ListBox Scroller - Windows 10 (UWP)

<Style TargetType="ListBox">
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>

0
FazelMan

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.

0
Bill Clyde