2009-05-29 2 views
14

Wie kann ich programmgesteuert ein Silverlight-Listenfeld zwingen, nach unten zu scrollen, sodass das zuletzt hinzugefügte Element immer sichtbar ist.Automatisches Scrollen in einem Silverlight-Listenfeld

Ich habe versucht, einfach das Element auszuwählen. Es endet als ausgewählt, ist aber immer noch nicht sichtbar, es sei denn, Sie scrollen manuell dorthin.

+0

+1 für Hinweise, wie Silverlight das grundlegendste Feature auf einer ListBox ausließ, die ich mir vorstellen kann. WinForms hat es für immer gehabt! Schade, dass du momentan kein Mitglied bist :) –

Antwort

24

Verwenden Sie die ScrollIntoView-Methode der ListBox, um den letzten Eintrag zu übergeben. Möglicherweise müssen Sie UpdateLayout sofort aufrufen, bevor es funktioniert.

+1

Das ist genau die Antwort, nach der ich gesucht habe, außer ... Ich kann es nicht zur Arbeit bringen. Es scheint, wie das funktionieren sollte ... Wenn lst.Items.Count> 0 Then lst.SelectedIndex = lst.Items.Count - 1 lst.ScrollIntoView (lst.SelectedItem) lst.UpdateLayout() Else Die Der letzte Eintrag ist ausgewählt, aber nicht sichtbar. –

+1

Rufen Sie UpdateLAYOUT vor ScrollIntoView, hoffentlich wird das für Sie arbeiten. –

+0

Das hat den Trick gemacht. Funktioniert genau so, wie ich es jetzt wollte. Vielen Dank. –

7

Die ScrollIntoView() -Methode scrollt das letzte Element in die Ansicht, jedoch muss listBox.UpdateLayout() kurz vor ScrollIntoView() aufgerufen werden. Dies ist die komplette Methode mit Code:

// note that I am programming Silverlight on Windows Phone 7 

    public void AddItemAndScrollToBottom(string message) 
    { 
     string timestamp = DateTime.Now.ToString("mm:ss"); 
     var item = new ListBoxItem(); 
     item.Content = string.Format("{0} {1}", timestamp, message); 
     // note that when I added a string directly to the listbox, and tried to call ScrollIntoView() it did not work, but when I add the string to a ListBoxItem first, that worked great 
     listBoxEvents.Items.Add(item); 

     if (listBoxEvents.Items.Count > 0) 
     { 
      listBoxEvents.UpdateLayout(); 
      var itemLast = (ListBoxItem)listBoxEvents.Items[listBoxEvents.Items.Count - 1]; 
      listBoxEvents.UpdateLayout(); 
      listBoxEvents.ScrollIntoView(itemLast); 
     } 
    } 
+0

danke, funktioniert gut – ieaglle

4

Refactoring Slightly die Codezeilen zu reduzieren:

listBoxEvents.Add(item) 
listBoxEvents.UpdateLayout() 
listBoxEvents.ScrollIntoView(listBoxEvents.Items(listBoxEvents.Items.Count - 1)) 
0

Gerade ging durch diese und keine der oben genannten Lösungen in einer Silverlight-5 App gearbeitet. Die Lösung stellte sich heraus:

public void ScrollSelectedItemIntoView(object item) 
{ 
     if (item != null) 
     {     
      FrameworkElement frameworkElement = listbox.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement; 
      if (frameworkElement != null) 
      { 
       var scrollHost = listbox.GetScrollHost();      
       scrollHost.ScrollIntoView(frameworkElement); 
      } 
     }     
}