2009-05-29 8 views
14

¿Cómo puedo forzar programáticamente un cuadro de lista de Silverlight para desplazarse hacia abajo para que el último elemento agregado esté siempre visible.Desplazamiento automático en un cuadro de lista de Silverlight

He intentado simplemente seleccionando el artículo. Termina como seleccionado pero aún no visible a menos que se desplace manualmente hacia él.

+0

+1 para señalar cómo Silverlight omitió la función más básica de un ListBox que puedo imaginar. ¡WinForms lo ha tenido para siempre! Es una pena que en realidad no eres miembro en este momento :) –

Respuesta

24

Use el método ScrollIntoView de ListBox que pasa en el último elemento. Es posible que deba llamar a UpdateLayout inmediatamente antes de que funcione.

+1

Esta es exactamente la respuesta que estaba buscando, excepto ... No puedo hacer que funcione. Parece que esto debería funcionar ... Si lst.Items.Count> 0 Entonces lst.SelectedIndex = lst.Items.Count - 1 lst.ScrollIntoView (lst.SelectedItem) lst.UpdateLayout() Else El el último artículo está seleccionado pero no a la vista. –

+1

Llamar UpdateLayout ANTES de ScrollIntoView, con suerte eso funcionará para usted. –

+0

Eso hizo el truco. Funciona exactamente como yo quería ahora. Gracias. –

7

El método ScrollIntoView() desplazará el último elemento a la vista, sin embargo debe llamarse a listBox.UpdateLayout() justo antes de ScrollIntoView(). Aquí es un método completo con el código:

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

gracias, funciona bien – ieaglle

4

ligeramente rediseñado para reducir las líneas de código:

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

acaba de pasar por esto y ninguna de las soluciones anteriores dio resultado en una aplicación de Silverlight 5. La solución resultó ser la siguiente:

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); 
      } 
     }     
} 
Cuestiones relacionadas