如何在UWP XAML/C#中通过滚动查看器更改滚动量?

5
我正在使用ListView来显示一些高度为100的项目。在有许多项的情况下,会显示带有ScrollViewer属性的垂直滚动条。然而,当用户滚动列表时,有时会滚动半个屏幕,因此只需滚动一次即可覆盖整个列表视图。
我想要一些代码来设置滚动量,例如每次100高度。我尝试通过搜索doc来实现,但找不到任何内容。实际上,数据来自绑定,项目数量会变化,但对于每个项目具有一些固定的高度是可以的。
示例代码:
<ListView Name="lvSummaryList" ScrollViewer.VerticalScrollMode="Enabled"
                                              ScrollViewer.IsVerticalRailEnabled="True"
                                              VerticalAlignment="Bottom"
                                              SelectionMode="None"                                          ScrollViewer.VerticalScrollBarVisibility="Auto"   
                                              ScrollViewer.HorizontalScrollMode="Disabled"              ScrollViewer.IsVerticalScrollChainingEnabled="True"
                                              Margin="0,5,10,0"
                                              MaxHeight="600" >
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <ItemsWrapGrid Orientation="Horizontal" GroupPadding="1"  Margin="1" MinHeight="100" MaxHeight="200" MaximumRowsOrColumns="4" VerticalAlignment="Center"/>
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
 </ListView>

我该如何实现这个,有没有属性或方法可以重写当前的行为?
2个回答

3

实现你想要的效果更简单的方法是在ScrollViewer上启用捕捉点。

将以下内容用作ListView的样式:

        <Style TargetType="ListView"
               x:Key="SnapListViewStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListView">
                        <Border BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                            <ScrollViewer x:Name="ScrollViewer"
                                          TabNavigation="{TemplateBinding TabNavigation}"
                                          HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
                                          HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                                          IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
                                          VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
                                          VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
                                          IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
                                          IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
                                          IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
                                          VerticalSnapPointsAlignment="Near"
                                          VerticalSnapPointsType="MandatorySingle"
                                          ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}"
                                          IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
                                          BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
                                          AutomationProperties.AccessibilityView="Raw">
                                <ItemsPresenter Header="{TemplateBinding Header}"
                                                HeaderTemplate="{TemplateBinding HeaderTemplate}"
                                                HeaderTransitions="{TemplateBinding HeaderTransitions}"
                                                Footer="{TemplateBinding Footer}"
                                                FooterTemplate="{TemplateBinding FooterTemplate}"
                                                FooterTransitions="{TemplateBinding FooterTransitions}"
                                                Padding="{TemplateBinding Padding}" />
                            </ScrollViewer>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

如果这样做没有达到你想要的效果,可以尝试不同的VerticalSnapPointsTypeVerticalSnapPointsAlignment值。

0

您可以尝试设置SmallChange属性,或者监听垂直ScrollBar的Scroll事件,并根据需要实时调整ScrollBar位置。

附注:还有其他获取ListView滚动视图引用的方法,不仅限于所示的方法。

    public MainPage()
    {
        this.InitializeComponent();

        var scrollViewer = GetDescendants(lvSummaryList).OfType<ScrollViewer>().FirstOrDefault();
        var verticalScrollbar = GetDescendants(scrollViewer).OfType<ScrollBar>()
            .FirstOrDefault(x => x.Orientation == Orientation.Vertical);

        verticalScrollbar.SmallChange = 5;

        //You can listen to the Scroll event of the vertical ScrollBar, and to pragmatically adjust the ScrollBar position
        /*verticalScrollbar.Scroll += (o, e) =>
        {
            if (e.ScrollEventType != ScrollEventType.EndScroll)
                scrollViewer.ScrollToVerticalOffset(100); // Scroll to the top

            if (e.NewValue >= verticalScrollbar.Maximum)
                scrollViewer.ScrollToVerticalOffset(0); // Scroll to the top
        };*/
    }

    public static IEnumerable<DependencyObject> GetDescendants(DependencyObject start)
    {
        var queue = new Queue<DependencyObject>();
        var count = VisualTreeHelper.GetChildrenCount(start);

        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(start, i);
            yield return child;
            queue.Enqueue(child);
        }

        while (queue.Count > 0)
        {
            var parent = queue.Dequeue();
            var count2 = VisualTreeHelper.GetChildrenCount(parent);

            for (int i = 0; i < count2; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                yield return child;
                queue.Enqueue(child);
            }
        }
    }

1
我在 var scrollViewer = GetDescendants(lvSummaryList).OfType<ScrollViewer>().FirstOrDefault(); 中获取到了滚动视图的空值。 - Chirag Rupani
在 Loaded 事件中执行。 - Justin XL
1
明白了,一旦设置了项目源,它就可以工作。这对于以编程方式获取滚动查看器非常有帮助,小的更改可以起作用,但其他答案帮助我获得平滑滚动,特别是避免在滚动的最后出现弹跳,因此将其标记为已接受。 - Chirag Rupani

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