2009-01-23 8 views
66

Im folgenden Beispiel habe ich eine ListBox mit Dutzenden von Schriftnamen.Wie kann ich eine vertikale Bildlaufleiste in meiner ListBox bekommen?

Ich hätte gedacht, dass es automatisch eine vertikale Bildlaufleiste darauf haben würde, so dass Sie beliebige Schriftart auswählen können, nicht nur die ersten in der Liste, aber es tut es nicht.

Also habe ich einen "ScrollViewer" hinzugefügt, der rechts einen "Scrollbalkenbereich" platziert, aber es gibt keine Bildlaufleiste im Bildlaufbereich, so dass Sie blättern können (!).

Warum ist eine Bildlaufleiste nicht automatisch und wie erzwinge ich eine Bildlaufleiste?

Antwort

116

Das Problem mit Ihrer Lösung ist, dass Sie eine Bildlaufleiste um eine ListBox platzieren, wo Sie sie wahrscheinlich in die ListBox einfügen möchten.

Wenn Sie eine Bildlaufleiste in Ihrer ListBox erzwingen möchten, verwenden Sie die angefügte Eigenschaft ScrollBar.VerticalScrollBarVisibility.

Wenn Sie diesen Wert auf Auto setzen, wird die Bildlaufleiste bei Bedarf geöffnet.

+1

In meinem Fall habe ich auch die 'ListBox' in einem' ScrollViewer' gestellt hatte und die 'ListBoxItems' streckten so breit wie sie wollten außerhalb der Größe der 'ListBox'. Das Entfernen des 'ScrollViewers' und das Einstellen von' ScrollViewer.VerticalScrollBarVisibility = "Visible" 'und' ScrollViewer.HorizontalScrollBarVisibility = "Disabled" 'hat den Trick gemacht. Vielen Dank für Ihre Hilfe! – mandarin

16

Ich habe eine "Höhe" zu meiner ListBox hinzugefügt und die Bildlaufleiste schön hinzugefügt.

+6

Versuchen Sie, die Höhen- und Breiteneigenschaften zu vermeiden, da sie die Straße schwierig machen können. Sie gehen besser mit der Lösung von JaredPar. –

+0

Ich mache das, aber es stellt nur einen "Bildlaufbereich" auf der rechten Seite ohne Scrollbar selbst, und meine Liste geht über den unteren Rand meines Fensters hinunter in alle Ewigkeit, wie kann ich die Listbox (Stopp an der Unterseite der Fenster)? –

+15

Weil es sich in einem StackPanel befindet, wird ihm fröhlich der gesamte Platz zur Verfügung gestellt, den es benötigt, also denkt es nicht, dass es * eine Bildlaufleiste braucht. – Donnelle

3

Die Bildlaufleiste wird automatisch zum Listenfeld hinzugefügt, sofern ihre Sichtbarkeit nicht auf Versteckt eingestellt ist. Immer wenn die Größe von Listeneinträgen die Größe überschreitet, die innerhalb eines Listbox-vertikalen oder horizontalen Listenfelds angezeigt werden kann, kann dies während der Laufzeit angezeigt werden.

23

ListBox enthält bereits ScrollViewer. Standardmäßig wird die ScrollBar angezeigt, wenn mehr Inhalt als Platz vorhanden ist. Einige Container passen sich jedoch ihren Inhalten an (z. B. StackPanel), so dass niemals "mehr Inhalt als Platz" vorhanden ist. In solchen Fällen wird dem ListBox immer so viel Platz zugewiesen, wie für den Inhalt benötigt wird.

Um die Bedingung zu berechnen, mehr Inhalt als Platz zu haben, sollte die Größe bekannt sein. Stellen Sie sicher, dass Ihre ListBox eine eingeschränkte Größe aufweist, indem Sie entweder explizit die Größe des Elements ListBox oder des Host-Steuerfelds festlegen.

Wenn das Host-Panel 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.B. Grid kann der ListBox durch den Container 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 die Grid von einem StackPanel enthalten ist, wird die äußereen StackPanel erweitert, um sein unmittelbares Kind Grid, so unterbringen, dass das Kind erweitern sein Kind (die ListBox) aufzunehmen.

Wenn Sie die Höhe an jedem Punkt — durch Einstellen der Höhe der ListBox begrenzen, indem die Höhe der inneren Grid Einstellung oder einfach durch den äußeren Behälter macht ein Grid — dann eine vertikale Bildlaufleiste automatisch jedes Mal erscheint Es gibt zu viele Listenelemente, die in das Steuerelement passen.

+0

Wenn Sie ein DockPanel als übergeordneten Container verwenden, müssen Sie nicht wissen, wie viele Elemente Sie als untergeordnete Elemente hinzufügen oder ein beliebiges Höhenattribut vordefinieren möchten. Definieren Sie für jedes Kind DockPanel.Dock = Top. Dadurch können Ihre Scrollviewer-Childs ihre Bildlaufleisten nach Bedarf anzeigen. Nicht allgemein getestet, hat es in meinem Anwendungsfall funktioniert. BR, Daniel – dba

1

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 zugewiesenen Speicherplatz füllt.

0

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 das, indem ich die beiden stattdessen in ein DockPanel steckte. Ich setze die ComboBox DockPanel.Dock = "Top" und lasse die ListBox den verbleibenden Platz füllen.

0

XAML ListBox Scroller - Microsoft Windows 10 (UWP)

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

Verwandte Themen