2009-05-29 20 views
14

Jak mogę programowo wymusić pole listy silverlight, aby przewinąć do dołu, tak aby ostatni dodany element był zawsze widoczny.Automatyczne przewijanie w polu listy Silverlight

Próbowałem po prostu wybrać pozycję. Kończy się jako zaznaczony, ale wciąż niewidoczny, chyba że ręcznie przewiniesz do niego.

+0

+1 za wskazanie jak Silverlight pominąć najbardziej podstawową cechę na ListBox mogę sobie wyobrazić. WinForms ma to na zawsze! Szkoda, że ​​aktualnie nie jesteś członkiem :) –

Odpowiedz

24

Użyj metody ScrollIntoView ListBox, przekazując ostatni element. Może być konieczne wywołanie UpdateLayout bezpośrednio przed nim, aby działał.

+1

To jest dokładnie odpowiedź, której szukałem, z wyjątkiem ... Nie mogę jej uruchomić. Wydaje się, że to powinno działać ... Jeśli lst.Items.Count> 0 Then lst.SelectedIndex = lst.Items.Count - 1 lst.ScrollIntoView (lst.SelectedItem) lst.UpdateLayout() Else ostatni element jest zaznaczony, ale nie jest widoczny. –

+1

Zadzwoń UpdateLayout PRZED ScrollIntoView, mam nadzieję, że to zadziała. –

+0

To załatwiło sprawę. Działa dokładnie tak, jak chciałem teraz. Dziękuję Ci. –

7

Metoda ScrollIntoView() przewinie ostatni element do widoku, jednak listBox.UpdateLayout() musi zostać wywołany tuż przed ScrollIntoView(). Powyżej znajduje się pełna metoda z kodem:

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

dziękuję, działa dobrze – ieaglle

4

Lekko refactored w celu zmniejszenia linii kodu:

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

Właśnie przeszedł to i żadne z powyższych rozwiązań przepracowanych w Silverlight 5 aplikacji. Rozwiązaniem okazała się następująco:

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); 
      } 
     }     
} 
Powiązane problemy