在WPF框架上设置ScrollViewer(用于垂直滚动)的正确方法是什么?

12

有人知道在框架上定义垂直滚动条的这种方式与其他方式的区别吗:

        <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个回答

30

当您使用 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.VerticalScrollBarVisibilityScrollViewer.HorizontalScrollBarVisibility附加属性。该代码的结果与您期望的完全相反。没有HorizontalScrollBar可见...而您仍然可以看到VerticalScrollBar。因此,这就是您应该使用的内容。
<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
        <Frame Name="Frame1" />
</ScrollViewer>

例如,当你尝试使用ListBox时,结果将会有所不同。

以下是这段代码的结果:

在此处输入图片描述

<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 附加属性适用于那些希望影响控件模板内存在的 ScrollViewer 而不是父级 ScrollViewer 的情况。因此,我认为它不会像 DockPanel.Dock 那样对父级 DockPanel 生效。


谢谢,这确实有帮助! - JDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接