滚动到底部ListBox Silverlight NOT WP7时加载更多数据

时间:2013-04-23 19:55:07

标签: c# .net silverlight web-applications listbox

我想要一个listBox,我将填充项目。当用户滚动到listBox的底部时,listBox应加载更多项目。

在WP7中有很多教程可以做到这一点,但是我没有在Silverlight Web应用程序中找到任何可靠的内容。

在尝试不同的事情时,我设法创建了一个方法,当用户滚动到ListBox的底部时,该方法可以显示消息。这更像是一个概念证明,而不是最终实现:

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应用程序中实现这一功能。

1 个答案:

答案 0 :(得分:2)

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

我的ListBox

<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" />

此方法由ListBox的{​​{1}}事件调用,并将自定义绑定附加到Loaded内的ScrollViewer。此绑定将检查ListBox的{​​{1}}属性中的更改:

ScrollViwer

最后,只要VerticalOffset

发生变化,就会调用此方法
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);
    }