web-dev-qa-db-fra.com

Comment corriger ScrollViewer (pour le défilement vertical) sur un cadre WPF?

quelqu'un connaît-il la différence entre définir une barre de défilement verticale sur un cadre comme celui-ci:

        <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
            <Frame Name="Frame1"
                   ScrollViewer.CanContentScroll="True" />
        </ScrollViewer>

ou comme ça:

        <ScrollViewer Grid.Row="2">
            <Frame Name="Frame1"
                   ScrollViewer.VerticalScrollBarVisibility="Auto"
                   ScrollViewer.CanContentScroll="True" />
        </ScrollViewer>

Ce cadre est imbriqué dans un contrôle WebBrowser et le définir de la première manière affiche correctement la barre de défilement verticale et n'est visible que lorsqu'il a besoin de défiler (auto). Lorsque je le règle de la deuxième façon, la barre de défilement verticale fonctionne mais est toujours visible même lorsqu'elle n'a pas besoin de défiler (visible).

Je vais utiliser la 1ère option car elle répond à mes besoins, mais je ne veux pas être surpris en cours de route si je ne la configure pas correctement.

Merci!

12
JDL

Lorsque vous utilisez ScrollViewer.VerticalScrollBarVisibility ou ScrollViewer.HorizontalScrollBarVisibility propriété attachée, elle n'a aucun effet avec Frame.

<ScrollViewer Margin="225.667,-4,0,296.939" HorizontalAlignment="Left" Width="221.667">
        <Frame Content="Frame" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Hidden" Source="UserControl2.xaml" Background="#FFDE5454"/>
</ScrollViewer>

Dans l'exemple ci-dessus, j'ai utilisé les deux ScrollViewer.VerticalScrollBarVisibility et ScrollViewer.HorizontalScrollBarVisibility propriétés attachées. le résultat de ce code est exactement le contraire de ce que vous attendez. Il n'y a pas de HorizontalScrollBar visible ... et vous pouvez toujours voir VerticalScrollBar.

Voilà pourquoi c'est ce que vous devez utiliser

<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
        <Frame Name="Frame1" />
</ScrollViewer>

Lorsque vous essayez ceci par exemple avec ListBox, le résultat sera différent.

C'est le résultat du code suivant:

enter image description here

<ScrollViewer Margin="225.667,0,0,12.761" Height="280.178" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="221.667">
        <ListBox ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Visible" Background="Orange" ItemsSource="{Binding Collection}" DisplayMemberPath="Property1" />
</ScrollViewer>

En effet, ces propriétés attachées affectent désormais ScrollViewer dans ListBox et non le parent ScrollViewer comme vous pouvez vous y attendre.

Donc, à partir de cette petite expérience, je suppose que ScrollViewer.VerticalScrollBarVisibility la propriété jointe est destinée aux cas où vous souhaitez pouvoir affecter ScrollViewer qui existe dans le modèle de Control et non le parent ScrollViewer. Je pense donc que cela ne fonctionne pas par exemple comme DockPanel.Dock qui prend effet sur le parent DockPanel.

28
Kapitán Mlíko