2010-12-16 14 views
6

Ich versuche einen Effekt zu erreichen, bei dem mehr Elemente an die Liste angehängt werden, wenn der Benutzer zum letzten Element scrollt. Ich habe keine Möglichkeit gefunden festzustellen, ob der Benutzer zum Ende der Liste gescrollt hat. Ich sehe kein Ereignis auf ListBox, das ausgelöst wird, wenn der Benutzer das Ende der Liste erreicht. Etwas, das mir sagt, wenn ein Gegenstand ins Bild gerollt wurde, wäre großartig, aber soweit ich das beurteilen kann, gibt es nichts dergleichen.WP7 Auto Grow ListBox beim Erreichen des letzten Elements

Ist dies sogar in WP7 möglich?

Bearbeiten: Eine andere Möglichkeit, dies zu sagen ist, können wir erkennen, wenn eine Liste "geprallt" hat?

Antwort

-1

Verwenden Sie die DeferredLoadListBox.

+0

Dies ist nicht die Wirkung, die leider sah Wesen. –

5

Es ist nicht super einfach gehen zu bekommen, da es viele bewegliche Teile sind, aber hier ist das, was Sie tun können, vorausgesetzt, Sie eine kurze Liste wollen, die mehr aus Ihren Daten lädt, wie Sie unten gehen Scrollen, ähnlich wie viele twitter-Anwendungen, usw.

  • Ihre eigene Unterklasse von ObservableCollection schreiben, die nur ein paar Elemente bietet bis (wie 20), hielt den Rest zu halten, bis
  • auf dem Scroll-Viewer (innen Schalte angefordert zurück die Listbox oder der Container) und sein visueller Status änderte Ereignisse, Sie können die NotScrolling und Scrolling-Änderungen erhalten; Ein Beispiel see this code by ptorr
  • Wenn nicht mehr steigt, viewer scroll extensions code verwenden, um zu sehen, wo die Dinge erweitert (am Boden oder nicht) oder nur die rohen Scroll-Viewer Eigenschaften, um zu sehen, ob es Wenn dies der Fall auf den Boden
  • verlängert wird, lösen Sie Ihre beobachtbare Sammlung, um einen anderen Satz von Gegenständen freizugeben.

Entschuldigung, ich habe keine vollständige Probe bereit, um noch zu bloggen. Viel Glück!

5

Ich habe dies nur für Overflow7 implementiert.

Der Ansatz, den ich war zu http://blog.slimcode.com/2010/09/11/detect-when-a-listbox-scrolls-to-its-end-wp7/ ähnlich nahm

jedoch stattdessen eine Art der Verwendung von I in Code den Haken nach oben hat.

abgeleitet Grundsätzlich meine Eltern Usercontrol aus:

public class BaseExtendedListUserControl : UserControl 
{ 
    DependencyProperty ListVerticalOffsetProperty = DependencyProperty.Register(
     "ListVerticalOffset", 
     typeof(double), 
     typeof(BaseExtendedListUserControl), 
     new PropertyMetadata(new PropertyChangedCallback(OnListVerticalOffsetChanged))); 

    private ScrollViewer _listScrollViewer; 

    protected void EnsureBoundToScrollViewer() 
    { 
     if (_listScrollViewer != null) 
      return; 

     var elements = VisualTreeHelper.FindElementsInHostCoordinates(new Rect(0,0,this.Width, this.Height), this); 

     _listScrollViewer = elements.Where(x => x is ScrollViewer).FirstOrDefault() as ScrollViewer; 

     if (_listScrollViewer == null) 
      return; 

     Binding binding = new Binding(); 
     binding.Source = _listScrollViewer; 
     binding.Path = new PropertyPath("VerticalOffset"); 
     binding.Mode = BindingMode.OneWay; 
     this.SetBinding(ListVerticalOffsetProperty, binding); 
    } 

    public double ListVerticalOffset 
    { 
     get { return (double)this.GetValue(ListVerticalOffsetProperty); } 
     set { this.SetValue(ListVerticalOffsetProperty, value); } 
    } 

    private static void OnListVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     BaseExtendedListUserControl control = obj as BaseExtendedListUserControl; 
     control.OnListVerticalOffsetChanged(); 
    } 

    private void OnListVerticalOffsetChanged() 
    { 
     OnListVerticalOffsetChanged(_listScrollViewer); 

    } 

    protected virtual void OnListVerticalOffsetChanged(ScrollViewer s) 
    { 
     // do nothing 
    } 
} 

bedeutete dies dann, dass sich in der Benutzersteuerung ich gerade verwenden könnte:

 protected override void OnListVerticalOffsetChanged(ScrollViewer viewer) 
    { 
     // Trigger when at the end of the viewport 
     if (viewer.VerticalOffset >= viewer.ScrollableHeight) 
     { 
      if (MoreClick != null) 
      { 
       MoreClick(this, new RoutedEventArgs()); 
      } 
     } 
    } 

    private void ListBox1_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 
    { 
     EnsureBoundToScrollViewer(); 
    } 

Die „Hacky“ Ding hier war, dass ich musste benutze ListBox1_ManipulationCompleted und VisualTreeHelper, um meinen ScrollViewer zu finden - ich bin mir sicher es gibt bessere Möglichkeiten ...

+0

+1 - scheint wie die beste der ungenießbaren Optionen. – McGarnagle

7

Daniel Vaughan hat ein Beispiel für die Erkennung dafür bei 01 geschrieben

+0

Leider führt dies zu Speicherverlusten, wie in http://support.microsoft.com/kb/938416 beschrieben. Das Ergebnis ist, dass eine Seite, die diese Technik verwendet, nicht von GC freigegeben wird. –

+0

@Agent_L - Wissen Sie, ob dies für Windows Phone 8 gelöst wurde? Ich kann nicht sagen, dass ich es verstehe, aber ich habe gerade Daniel Vaughans neue Version in seinem W8 entfesselt implementiert und möchte sicherstellen, dass ich hier nichts verpasse. – Jimmyt1988

+0

@ Jimmyt1988 Ich habe keine Ahnung, ich benutze andere Lösung. IMHO sind alle Konzepte, die auf dem Erreichen des exakten Scroll-Endes basieren, fehlerhaft. Der Benutzer scrollt * fast * bis zum Ende und löst daher niemals die Ladeaktion aus. Ich verwende ein zusätzliches Element, das am Ende der Liste hinzugefügt wird und ständig anzeigt, dass es "geladen" wird, und dieses Element, das in Sicht kommt (wird von der Benutzeroberfläche in der virtualisierten Liste aufgerufen), löst das Laden von mehr Daten aus. Es hat zwei Vorteile: Der Benutzer wird sofort informiert, dass die Liste geladen wird, und die Ladeaktion findet tatsächlich einige Zeit statt, bevor sie in Sicht kommt. Bei einer schnellen Verbindung kann der Benutzer also niemals Objekte springen sehen. –

Verwandte Themen