ListBox:如何在WinRT(WP8.1)中检测压缩(滚动结束)状态?

时间:2015-05-13 11:59:29

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

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

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

2 个答案:

答案 0 :(得分:0)

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

只需将ListBox包裹在ScrollViewer周围,然后设置viewChanged事件处理程序即可获得所需内容。

在这种情况下,我使事件触发了#34;加载更多数据"当用户几乎在ScrollViewer的末尾

<强> UI

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

答案 1 :(得分:-1)

尝试从listview中提取scrollviewer并使用以下方法

代码背后:

try:
    1 << 31
except OverflowError:
    # 32-bit
    MAXSIZE = int((1 << 31) - 1)
else:
    # 64-bit
    MAXSIZE = int((1 << 63) - 1)

UI:

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

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