关于滚动条:在WPF框架上设置ScrollViewer(用于垂直滚动)的正确方法?

Correct way to set ScrollViewer (for vertical scrolling) on a WPF Frame?

有谁知道在这样的框架上定义垂直滚动条的区别:

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

或像这样:

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

该框架嵌套在WebBrowser控件中,并通过第一种方式对其进行设置以正确显示垂直滚动条,并且仅在需要滚动(自动)时才可见。 当我以第二种方式设置它时,垂直滚动条可以工作,但是即使不需要滚动(可见)也始终可见。

我将使用第一个选项,因为它可以满足我的需求,但是如果我设置不正确,我不会感到意外。

谢谢!


当使用ScrollViewer.VerticalScrollBarVisibilityScrollViewer.HorizontalScrollBarVisibility附加属性时,它对Frame无效。

1
2
3
<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.VerticalScrollBarVisibilityScrollViewer.HorizontalScrollBarVisibility附加属性。 该代码的结果与您期望的结果完全相反。 没有可见的HorizontalScrollBar ...,您仍然可以看到VerticalScrollBar

这就是为什么这是您应该使用的原因

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

例如,当您使用ListBox尝试此操作时,结果将有所不同。

这是以下代码的结果:

enter image description here

1
2
3
<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>

这是因为这些附加属性现在会影响ListBox中的ScrollViewer,而不是您可能期望的父ScrollViewer

因此,从这个小实验中,我假定ScrollViewer.VerticalScrollBarVisibility附加属性用于希望影响Control模板中而不是父ScrollViewer中的ScrollViewer的情况。 因此,我认为它不起作用,例如DockPanel.Dock会对父DockPanel生效。