【问题标题】:UWP - ListView Scrolling - won't stay at scrolled positionUWP - ListView 滚动 - 不会停留在滚动位置
【发布时间】:2016-01-23 17:36:23
【问题描述】:

我有一个 ListView 分组。一切正常,除了滚动。如果我想向下滚动ListView,那么在释放ListView 后会回到开头。我尝试将ScrollViewer.VerticalScrollMode 设置为EnabledScrollViewer.VerticalScrollBarVisibility 设置为Auto。但没有成功。

XAML 代码:

<PivotItem>
    <StackPanel Orientation="Vertical" >    
        <TextBox x:Name="SearchBox"
                     PlaceholderText="Search ... "
                     TextChanged="SearchBox_TextChanged"/>

        <ListView x:Name="ContactsListView"
                  ItemTemplate="{StaticResource ContactsTemplate}"
                  ItemsSource="{x:Bind ContactsViewSource.View}"
                  SelectionMode="Single"
                  ScrollViewer.VerticalScrollMode="Enabled"
                  ScrollViewer.VerticalScrollBarVisibility="Auto" >

                  <ListView.GroupStyle>
                     <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                           <DataTemplate x:DataType="data:GroupingItem">
                              <TextBlock Text="{x:Bind Key}"
                                         Foreground="Blue"
                                         Style="{ThemeResource TitleTextBlockStyle}"/>
                           </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                     </GroupStyle>
                  </ListView.GroupStyle>
        </ListView>
    </StackPanel>
</PivotItem>

你能给我一些提示吗?因为我已经搜索过网络但没有任何解决方案。提前致谢。

【问题讨论】:

    标签: xaml windows-10 uwp


    【解决方案1】:

    解决方法是将PivotItem中的Grid替换为StackPanel

    <PivotItem>
        <Grid>
           <Grid.RowDefinitions>
               <RowDefinition Height="50" />
               <RowDefinition Height="*" />
           </Grid.RowDefinitions>
            <TextBox x:Name="SearchBox"
                         PlaceholderText="Search ... "
                         TextChanged="SearchBox_TextChanged"
                         Grid.Row="0"/>
    
            <ListView x:Name="ContactsListView"
                      ItemTemplate="{StaticResource ContactsTemplate}"
                      ItemsSource="{x:Bind ContactsViewSource.View}"
                      SelectionMode="Single"
                      Grid.Row="1" >
    
                      <ListView.GroupStyle>
                         <GroupStyle>
                            <GroupStyle.HeaderTemplate>
                               <DataTemplate x:DataType="data:GroupingItem">
                                  <TextBlock Text="{x:Bind Key}"
                                             Foreground="Blue"
                                             Style="{ThemeResource TitleTextBlockStyle}"/>
                               </DataTemplate>
                            </GroupStyle.HeaderTemplate>
                         </GroupStyle>
                      </ListView.GroupStyle>
            </ListView>
       </Grid>
    </PivotItem>
    

    【讨论】:

    • 非常感谢。我自己不会想到这一点。
    【解决方案2】:

    如果我想向下滚动 ListView,那么释放 ListView 后会回到开头

    可以监听垂直ScrollBar的Scroll事件,并使用ScrollViewer实用的调整ScrollBar的位置,当它在底部时。

            var scrollViewer = GetDescendants(ContactsListView).OfType<ScrollViewer>().FirstOrDefault();
            var verticalScrollbar = GetDescendants(scrollViewer).OfType<ScrollBar>().FirstOrDefault(x => x.Orientation == Orientation.Vertical);
            verticalScrollbar.Scroll += (o, e) =>
            {
                if (e.ScrollEventType != ScrollEventType.EndScroll)
                    return;
    
                if (e.NewValue >= verticalScrollbar.Maximum)
                    scrollViewer.ScrollToVerticalOffset(0); // Scroll to the top
            };
    

    以下是可用于导航 ListView 可视化树以查找 ScrollViewer 和 Vertical ScrollBar 的帮助器类。

        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);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多