我想要一个可以填充项目的列表框。当用户滚动到 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 应用程序中实现:
- Here's a WP7 tutorial I can't use
- This one seemed promising but is poorly described and doesn't really work
- Here's another WP7 tutorial I can't use
我只需要指明正确的方向。无论是教程,还是我可以了解的可能实现这一点的概念,或者任何其他可以帮助我在 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" />
此方法由 ListBox
的 Loaded
事件调用,并将自定义绑定(bind)附加到 ListBox< 内的
。此绑定(bind)将检查 ScrollViewer
/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.
}
}
关于c# - 滚动到底部列表框 Silverlight 时加载更多数据而不是 WP7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178027/