2

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

在 WP7 中有大量的教程可以做到这一点,但我还没有找到在 Silverlight 网络应用程序中做到这一点的任何可靠的东西。

在尝试不同的事情时,我设法创建了一种方法,可以在用户滚动到 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 网络应用程序中实现:

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

4

1 回答 1

3

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

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

此方法由ListBoxLoaded事件调用,并将自定义绑定附加ScrollViewerListBox. 此绑定将检查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);
    }

最后,只要有更改,就会调用此方法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.
        }
    }
于 2013-04-25T14:36:39.767 回答