web-dev-qa-db-fra.com

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

J'ai suivi ceci petit "tutoriel" sur la façon d'ajouter une barre de défilement à un ItemsControl, et cela fonctionne en mode Designer, mais pas lorsque je compile et exécute le programme (seuls les premiers éléments sont visibles et aucune barre de défilement à afficher davantage - même lorsque VerticalScrollbarVisibility est défini sur "Visible" au lieu de "Auto").

Une idée sur la façon de résoudre ce problème?


C'est le code que j'utilise pour afficher mes éléments (normalement, je travaille avec Databinding, mais pour les voir dans mon Designer, je les ai ajoutés 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 voici 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>
123
Xuntar

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

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 .

69
Andrey Shvydky

Placez votre ScrollViewer dans un DockPanel et définissez la propriété DockPanel MaxHeight

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]
0
Patatrack