WPF: ItemsControl con barra di scorrimento (ScrollViewer)


128

Ho seguito questo piccolo "tutorial" su come aggiungere una barra di scorrimento a ItemsControl, e funziona in vista Designer, ma non quando compilo ed eseguo il programma (vengono visualizzati solo i primi elementi e nessuna barra di scorrimento per visualizzarne altri - anche quando VerticalScrollbarVisibility è impostato su "Visibile" anziché "Auto").

Qualche idea su come risolverlo?


Questo è il codice che uso per mostrare i miei articoli (normalmente lavoro con Databinding, ma per vedere gli articoli nel mio Designer li ho aggiunti manualmente):

<ItemsControl x:Name="itemCtrl" Style="{DynamicResource UsersControlStyle}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Top">
            </StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
</ItemsControl>

E questo è il mio modello:

<Style x:Key="UsersControlStyle" TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                    <ScrollViewer VerticalScrollBarVisibility="Visible">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Risposte:


261

Per ottenere una barra di scorrimento per un ItemsControl, puoi ospitarla in ScrollViewerquesto modo:

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <ItemsControl>
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
  </ItemsControl>
</ScrollViewer>

16
È così ovvio quando lo vedi ... Dato che vengo da Windows Form, mi trovo spesso bloccato nella mentalità sbagliata. Sembra che i diritti del WPF siano molti torti ... +1.
— Christoffer Lette,

3
Grazie molto utile. Concordo con Lette sul fatto che il mio cervello WinForms inizialmente non lo capisce.
— itsmatt

1
Ho appena provato questo qui e ancora non ha funzionato. ItemsControl scorre direttamente dal contenitore principale e non è visibile alcuna barra di scorrimento.
— Ristogod,

8
@Ristogod Se si ospita ScrollViewer all'interno di qualcosa che consente al contenuto di crescere quanto necessario, ad esempio StackPanel, lo scorrimento non funzionerà. Qual è il contenitore principale? Prova a impostare un'altezza fissa su ScrollViewer o sul genitore, ti aiuta?
— Oskar,

4
@Rod È possibile ospitare ScrollViewer in un DockPanel o in una griglia anziché in uno StackPanel per raggiungere questo obiettivo.
— Oskar,

79

Devi modificare il modello di controllo invece di ItemsPanelTemplate:

<ItemsControl >
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer x:Name="ScrollViewer" Padding="{TemplateBinding Padding}">
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>

Forse, il tuo codice non funziona perché StackPanel ha la propria funzionalità di scorrimento. Prova a utilizzare la proprietà StackPanel.CanVerticallyScroll .


1
Temo che la proprietà StackPanel CanVerticallyScroll non funzionasse.
— Xuntar,

StackPanel CanVerticallyScroll non ha funzionato, ma l'esempio di codice fornito qui ha funzionato per me. Grazie
— Souvik Basu,

Questo funziona Sto cercando di far scorrere scrollviewer all'interno invece che all'esterno, perché github.com/punker76/gong-wpf-dragdrop lo richiede.
— HelloSam,

3

Inserisci ScrollViewer in DockPanel e imposta la proprietà DockPanel MaxHeight

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.