UWP捕获列表视图滚动事件

7

我正在开发一款适用于Windows手机的通用应用程序。

我有一个列表视图和一个位于其上方的按钮。当我向下滚动列表视图时,我想隐藏按钮。

如何捕获滚动事件?如何访问列表视图内的 ScrollViewer?

我尝试了几种方法,但似乎都不起作用...

我的XAML代码如下:

<ListView x:Name="PostListView" Grid.Row="1"
                        IsItemClickEnabled="True"
                        ItemTemplate="{StaticResource PostItemTemplate}"
                        ItemsSource="{Binding Feed}"
                        ShowsScrollingPlaceholders="False"
                        ScrollViewer.VerticalScrollBarVisibility="Auto"
                        ScrollViewer.VerticalScrollMode="Enabled"
                        IncrementalLoadingTrigger="Edge">
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                <Setter Property="Padding" Value="0" />
                                <Setter Property="Margin" Value="0" />
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="ListViewItem">
                                            <ListViewItemPresenter
                                                SelectedBackground="{StaticResource LightStandardColorBrush}"
                                                SelectedPointerOverBackground="{StaticResource LightStandardColorBrush}"
                                                PressedBackground="{StaticResource LightStandardColorBrush}"
                                                SelectedPressedBackground="{StaticResource LightStandardColorBrush}"/>

                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </ListView.ItemContainerStyle>

                        <interactivity:Interaction.Behaviors>
                            <core:EventTriggerBehavior EventName="Tapped">
                                <core:InvokeCommandAction Command="{Binding PostItemTapped}" CommandParameter="{Binding ElementName=PostListView, Path=SelectedItem}"/>
                            </core:EventTriggerBehavior>
                        </interactivity:Interaction.Behaviors>
                    </ListView>


你试过我的解决方案了吗? - Archana
1个回答

3
你可以用两种方法实现这个功能:
1) 在 listview 中监听 PointerEntered 事件。
<ListView PointerEntered="PointerEntered" x:Name="PostListView" >
....
</ListView>

private void PointerEntered(object sender, PointerRoutedEventArgs e)
        {
            listScrollviewer = Scrolling(PostListView);
        }

        private ScrollViewer Scrolling(DependencyObject depObj)
        {
            ScrollViewer foundOne = GetScrollViewer(depObj);
            if (foundOne != null)
            {
                //    if (foundOne.VerticalOffset == 0)
                //    //refresh.Visibility = Visibility.Visible;
                //    else
                //refresh.Visibility = Visibility.Collapsed;
                foundOne.ViewChanging += foundOne_ViewChanging;
            }


            return foundOne;
        }

        public static ScrollViewer GetScrollViewer(DependencyObject depObj)
        {
            if (depObj is ScrollViewer) return depObj as ScrollViewer;

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                var child = VisualTreeHelper.GetChild(depObj, i);

                var result = GetScrollViewer(child);
                if (result != null) return result;
            }
            return null;
        }

        private void foundOne_ViewChanging(object sender, ScrollViewerViewChangingEventArgs e)
        {
          //YOur logic to hide the button
          if (e.NextView.VerticalOffset == 0)
            {
            }
           else
           {
              //Hide the button
           }

        }

2)第二种方式是编辑listview样式。在那里,您将会得到scrollviewer。

<ListView  Style="{StaticResource ListViewStyle1}">
...
</ListView>

<Style x:Key="ListViewStyle1" TargetType="ListView">
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="TabNavigation" Value="Once"/>
            <Setter Property="IsSwipeEnabled" Value="True"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Bottom"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled"/>
            <Setter Property="ScrollViewer.VerticalScrollMode" Value="Auto"/>
            <Setter Property="ScrollViewer.ZoomMode" Value="Disabled"/>
            <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="False"/>
            <Setter Property="ScrollViewer.BringIntoViewOnFocusChange" Value="True"/>
            <Setter Property="ItemContainerTransitions">
                <Setter.Value>
                    <TransitionCollection>
                        <AddDeleteThemeTransition/>
                        <ReorderThemeTransition/>
                    </TransitionCollection>
                </Setter.Value>
            </Setter>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <ItemsStackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListView">
                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                            <ScrollViewer x:Name="ScrollViewer" AutomationProperties.AccessibilityView="Raw" BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}" IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" TabNavigation="{TemplateBinding TabNavigation}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
                                <ItemsPresenter FooterTransitions="{TemplateBinding FooterTransitions}" FooterTemplate="{TemplateBinding FooterTemplate}" Footer="{TemplateBinding Footer}" HeaderTemplate="{TemplateBinding HeaderTemplate}" Header="{TemplateBinding Header}" HeaderTransitions="{TemplateBinding HeaderTransitions}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </ScrollViewer>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

谢谢!我尝试了第一种方法,它起作用了! - Nitan Alin

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