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>
War es hilfreich?

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.

passen

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>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top