【问题标题】:Load More Data When Scroll to Bottom ListBox Silverlight NOT WP7滚动到底部列表框时加载更多数据 Silverlight 不是 WP7
【发布时间】:2013-04-17 04:19:06
【问题描述】:

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

在 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 网络应用程序中实现这一点的东西。

【问题讨论】:

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


    【解决方案1】:

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

    此方法由ListBoxLoaded 事件调用,并将自定义绑定附加到ListBox 内的ScrollViewer。此绑定将检查 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.
            }
        }
    

    【讨论】:

    • 嗨 Bruno,你能告诉我你是怎么得到方法 scrollViewer = lstEventHistory.GetScrollHost();我在 ListBox 控件上的 Silverlight 项目中看不到它存在
    • 您好,我想我应该提到它,但您必须下载 Silverlight 工具包才能访问该方法。根据您的 Silverlight 版本,您可以下载它herehere。相信你也可以直接从 NuGet 获取。
    • 谢谢布鲁诺,这段代码帮助了我,顺便说一句,我正在尝试使用这个逻辑,这个逻辑有什么例外吗?我的意思是你知道的任何不适用的极端情况
    • 我唯一能想到的就是在使用旧版本的 Silverlight 时遇到问题。话虽如此,到目前为止,我只需要实施一次。顺便说一句,如果你觉得这个问题有帮助,别忘了点赞 :-)
    • 感谢 Bruno 的更新,是的,这个 Que/Answer 对我有帮助,而且刚刚投了赞成票。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多