c# - 滚动到底部列表框 Silverlight 时加载更多数据而不是 WP7

标签 c# .net silverlight web-applications listbox

我想要一个可以填充项目的列表框。当用户滚动到 listBox 底部时,listBox 应该加载更多项目。

有大量的教程可以在 WP7 中执行此操作,但我还没有找到任何可靠的内容可以在 Silverlight Web 应用程序中执行此操作。

在尝试不同的方法时,我设法创建了一种方法,可以在用户滚动到列表框底部时显示消息。这更多的是概念验证,而不是最终实现:

ScrollViewer scrollViewer = new ScrollViewer();
var childScrollViewer = VisualTreeHelper.GetChild(this, 0);
        if (childScrollViewer is ScrollViewer)
            scrollViewer = (ScrollViewer)childScrollViewer;

if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight)
            MessageBox.Show("You're at the bottom!");

我当前正在从 ListBox 的 MouseWheel 事件调用此方法。这种方法并不理想,因为它没有考虑用户单击滚动条并将其向下拖动的情况。此实现也很差,因为当用户滚动到列表框的顶部底部时会显示消息。

这里是我发现的一些不错的 WP7 教程,我希望可以在 Silverlight Web 应用程序中实现:

我只需要指明正确的方向。无论是教程,还是我可以了解的可能实现这一点的概念,或者任何其他可以帮助我在 Silverlight Web 应用程序中实现这一点的内容。

最佳答案

This教程救了我的命。这就是我最终所做的:

我的列表框:

<ListBox x:Name="lstEventHistory"
            Grid.Row="1"
            d:DataContext="{d:DesignData /SampleData/AssetLifeCycleSampleData.xaml}"
            Background="Transparent"
            BorderBrush="#FFD4D4D6"
            BorderThickness="0"
            ItemsSource="{Binding Source={StaticResource eventsViewSource}}"
            Loaded="initScrollViewerMonitor"
            ScrollViewer.VerticalScrollBarVisibility="Auto" />

此方法由 ListBoxLoaded 事件调用,并将自定义绑定(bind)附加到 ListBox< 内的 ScrollViewer/。此绑定(bind)将检查 ScrollViwerVerticalOffset 属性中的更改:

private void initScrollViewerMonitor(object sender, EventArgs e)
    {   
           //get the ScrollViewer from the ListBox
           scrollViewer = lstEventHistory.GetScrollHost();

            //attach to custom binding to check if ScrollViewer verticalOffset property has changed
            var binding = new Binding("VerticalOffset") { Source = scrollViewer };
            var offsetChangeListener = DependencyProperty.RegisterAttached(
                "ListenerOffset",
                typeof(object),
                typeof(UserControl),
                new PropertyMetadata(OnScrollChanged));
            scrollViewer.SetBinding(offsetChangeListener, binding);
    }

最后,只要 VerticalOffset 发生更改,就会调用此方法

public void OnScrollChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        //We have to check if the values are 0.0 because they are both set to this when the scrollviewer loads
        if ((scrollViewer.ScrollableHeight <= scrollViewer.VerticalOffset)
            && (scrollViewer.ScrollableHeight != 0.0 && scrollViewer.VerticalOffset != 0.0))
        {
            //The ScrollBar is at the bottom, load more results.
        }
    }

关于c# - 滚动到底部列表框 Silverlight 时加载更多数据而不是 WP7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178027/

相关文章:

c# - PagedViewCollection 按列分组,而不是属性

.net - PropertyGrid 可以编辑任何旧的键值对列表吗?

.net - System.String是一个类类型,但是为什么我们不用New关键字实例化就可以使用它呢?

wpf - Silverlight 中 System.Drawing.Bitmap 的替代方案,与 WPF 兼容

c# - Blazor Framework 如何在属性值更改时收到通知

c# - 有效地添加到 C# .NET 字典

silverlight - 如何在 Json.NET Silverlight 中使用 TypeNameHandling.Objects 反序列化?

c# - DataGridViewCheckBoxColumn 中的单元格以编程方式检查

c# - 将基于回调的类包装为异步类

c# - 线程安全的 SortedDictionary