2009-05-29 34 views
14

Làm cách nào tôi có thể lập trình buộc hộp danh sách màu bạc để cuộn xuống dưới cùng để mục cuối cùng được thêm luôn hiển thị.Tự động cuộn trong hộp danh sách Silverlight

Tôi đã thử chỉ cần chọn mục. Nó kết thúc như được chọn nhưng vẫn không hiển thị trừ khi bạn cuộn theo cách thủ công.

+0

+1 để chỉ ra cách Silverlight bỏ qua tính năng cơ bản nhất trên ListBox mà tôi có thể tưởng tượng. WinForms đã có nó mãi mãi! Xấu hổ bạn thực sự không phải là thành viên tại thời điểm này :) –

Trả lời

24

Sử dụng phương thức ScrollIntoView của ListBox truyền trong mục cuối cùng. Bạn có thể cần gọi UpdateLayout ngay trước khi nó hoạt động.

+1

Đây chính là câu trả lời tôi đang tìm kiếm ngoại trừ ... Tôi không thể làm cho nó hoạt động. Nó có vẻ như điều này sẽ làm việc ... Nếu lst.Items.Count> 0 Then lst.SelectedIndex = lst.Items.Count - 1 lst.ScrollIntoView (lst.SelectedItem) lst.UpdateLayout() khác Các mục cuối cùng được chọn nhưng không được xem. –

+1

Gọi UpdateLayout TRƯỚC KHI ScrollIntoView, hy vọng rằng nó sẽ làm việc cho bạn. –

+0

Điều đó đã làm các trick. Hoạt động chính xác như tôi muốn bây giờ. Cảm ơn bạn. –

7

Phương thức ScrollIntoView() sẽ cuộn mục cuối cùng vào dạng xem, tuy nhiên listBox.UpdateLayout() phải được gọi ngay trước ScrollIntoView(). Dưới đây là một phương pháp hoàn toàn với mã:

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

cảm ơn bạn, hoạt động tốt – ieaglle

4

Hơi refactored để giảm dòng mã:

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

Chỉ cần đi qua này và không ai trong số các giải pháp trên làm việc trong một ứng dụng Silverlight 5. Giải pháp hóa ra là:

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); 
      } 
     }     
} 
Các vấn đề liên quan