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.