Правильный способ установки ScrollViewer (для вертикальной прокрутки) на WPF-кадре?

Кто-нибудь знает разницу между определением вертикальной полосы прокрутки на кадре следующим образом:

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

или вот так:

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

Этот кадр вложен в элемент управления WebBrowser и устанавливает его на первый взгляд, правильно отображает вертикальную полосу прокрутки и видна только тогда, когда требуется прокрутка (авто). Когда я устанавливаю его вторым способом, вертикальная полоса прокрутки работает, но всегда видна, даже если ей не нужно прокручивать (видимо).

Я собираюсь использовать первый вариант, потому что он отвечает моим потребностям, но я не хочу удивляться, если я неправильно его установлю.

Спасибо!

Ответ 1

Когда вы используете прикрепленное свойство ScrollViewer.VerticalScrollBarVisibility или ScrollViewer.HorizontalScrollBarVisibility, оно не влияет на 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>

В приведенном выше примере я использовал свойства ScrollViewer.VerticalScrollBarVisibility и ScrollViewer.HorizontalScrollBarVisibility. исход этого кода является полной противоположностью тому, что вы ожидаете. Нет HorizontalScrollBar visible... и вы все еще можете видеть VerticalScrollBar.

Итак, почему вы должны использовать

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

Когда вы попробуете это, например, с ListBox, результат будет другим.

Это результат следующего кода:

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>

Это потому, что эти прикрепленные свойства теперь влияют на ScrollViewer в ListBox, а не на родителя ScrollViewer, как вы можете ожидать.

Итак, из этого небольшого эксперимента я предполагаю, что приложенное свойство ScrollViewer.VerticalScrollBarVisibility предназначено для случаев, когда вы хотите иметь возможность влиять на ScrollViewer, который существует в шаблоне управления, а не на родителя ScrollViewer. Поэтому я думаю, что это не работает, например, как DockPanel.Dock, который вступает в силу с родительским DockPanel.