142 votes

WPF: ItemsControl avec la barre de défilement (ScrollViewer)

J'ai suivi ce petit "tutoriel" comment ajouter une barre de défilement à un ItemsControl, et il fonctionne en mode Concepteur, mais pas quand je le compiler et exécuter le programme (le premier seulement quelques éléments, et pas de barre de défilement pour afficher plus d' - même quand VerticalScrollbarVisibility est "Visible" au lieu de "Auto").

Aucune idée sur comment résoudre ce problème?


C'est le code que j'utilise pour afficher mes articles (normalement je travail avec la liaison de données, mais pour voir les éléments dans mon Designer, j'ai ajouté manuellement):

<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>

Et c'est mon Modèle:

<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>

292voto

Oskar Points 3009

Pour obtenir une barre de défilement pour un ItemsControl , vous pouvez l'héberger dans un ScrollViewer comme ceci:

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

92voto

Andrey Shvydky Points 1181

Vous devez modifier le modèle de contrôle à la place de ItemsPanelTemplate:

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

Peut-être que votre code ne fonctionne pas car StackPanel possède sa propre fonctionnalité de défilement. Essayez d'utiliser la propriété StackPanel.CanVerticallyScroll .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X