2013-04-23 51 views
2

我想要一個列表框,我將填充項目。當用戶滾動到listBox的底部時,listBox應該加載更多的項目。當滾動到底部列表框時加載更多數據Silverlight不是WP7

在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應用程序中實現這一點的技巧。

回答

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

此方法由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. 
     } 
    } 
+0

嗨布魯諾調用此方法,你可以請讓我知道如何你有沒有得到方法scrollViewer = lstEventHistory.GetScrollHost(); 我沒有看到它存在我在ListBox的Silverlight項目conrol – 2013-06-06 06:45:35

+0

嗨,我想我應該提到它,但你必須下載Silverlight工具包才能訪問該方法。根據你的Silverlight版本,你可以下載它[這裏](http://silverlight.codeplex.com/releases/view/43528)或[這裏](http://silverlight.codeplex.com/)。我相信你也可以直接從NuGet中獲得它。 – Bruno 2013-06-07 14:50:15

+0

感謝布魯諾,這段代碼幫了我,順便說一句,只是一個小問題,我試圖用這個邏輯,這個邏輯是否有任何例外?我的意思是任何你不知道的角落案例 – 2013-06-12 05:22:48

相關問題