Automatic Scrolling in a Silverlight List Box

2019-01-26 04:45发布

问题:

How can I programmatically force a silverlight list box to scroll to the bottom so that the last item added is always visible.

I've tried simply selecting the item. It ends up as selected but still not visible unless you manually scroll to it.

回答1:

Use the ListBox's ScrollIntoView method passing in the last item. You may need to call UpdateLayout immediately before it for it to work.



回答2:

The ScrollIntoView() method will scroll the last item into view, however listBox.UpdateLayout() must be called just before ScrollIntoView(). Here is a complete method with 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);
        }
    }


回答3:

Slightly refactored to reduce the lines of code:

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


回答4:

Just went through this and none of the solutions above worked in a Silverlight 5 app. The solution turned out to be this:

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