【问题标题】:ListBox: How to detect compression (end of scroll) states in WinRT (WP8.1)?ListBox:如何在 WinRT (WP8.1) 中检测压缩(滚动结束)状态?
【发布时间】:2016-02-25 00:10:22
【问题描述】:

我正在开发基于 WinRT 的 Windows Phone 8.1 应用程序。

当用户将 ListBox 滚动到末尾时,我如何检测或接收通知?

【问题讨论】:

  • 展开缩略词,稍微改写。

标签: c# windows-runtime windows-phone-8.1


【解决方案1】:

编辑: 我知道这可能是一个老话题,但今天我恰好在同一条船上,所以这就是我想出的。

只需将ListBox 包裹在ScrollViewer 周围,并创建一个viewChanged 事件处理程序来获得我需要的东西。

在这种情况下,当用户几乎处于 ScrollViewer 的末尾时,我让事件触发“加载更多数据”

用户界面

<ScrollViewer VerticalScrollBarVisibility="Auto" ViewChanged="yourEvent_ViewChanged">
    <ListBox x:Name="ResultsListBox" ScrollViewer.VerticalScrollBarVisibility="Hidden">
    </ListBox>
</ScrollViewer>

代码隐藏

private void yourEvent_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
    if ((sender as ScrollViewer).VerticalOffset >= ((sender as ScrollViewer).ScrollableHeight - (sender as ScrollViewer).ViewportHeight / 4))
    {
        // Do your "Load more data" work here
    }
}

【讨论】:

    【解决方案2】:

    尝试从列表视图中拉出滚动查看器并使用以下方法

    后面的代码:

    public sealed partial class MainPage : Page
    {
        public ObservableCollection<String> Collection = new ObservableCollection<string>();
    
        private bool incall;
        private int offset;
        int _noofelements;
        ScrollViewer _scrollViewer;
    
        public MainPage()
        {
            this.InitializeComponent();
    
            this.NavigationCacheMode = NavigationCacheMode.Required;
            listview.ItemsSource = Collection;
            addNumber(0);
        }
    
        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 OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
        {
            ScrollViewer view = (ScrollViewer)sender;
            if ((view.VerticalOffset > 0.9 * view.ScrollableHeight) & !incall)
            {
                incall = true;
                addNumber(++offset);
            }
        }
    
        private void addNumber(int offset)
        {
            int start = offset * 20;
            for (int i = start; i < start + 20; i++)
            {
                if (i % 20 == 0)
                    Collection.Insert(0, (_noofelements++).ToString());
                else
                    Collection.Add((_noofelements++).ToString());
            }
    
            incall = false;
        }
    
        private void listview_Loaded(object sender, RoutedEventArgs e)
        {
            _scrollViewer = GetScrollViewer(listview);
            if (_scrollViewer != null)
            {
                _scrollViewer.ViewChanged += OnViewChanged;
            }
        }

    界面:

    <Grid>
        <ListView x:Name="listview" Loaded="listview_Loaded">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <ItemsStackPanel ItemsUpdatingScrollMode="KeepItemsInView"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Margin="25" FontSize="32" Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>

    尝试用 Listbox 替换 ListView,它会起作用。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2012-11-23
      • 2011-04-27
      • 2011-01-06
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      相关资源
      最近更新 更多