如何以编程方式强制将silverlight列表框滚动到底部,以便始终显示添加的最后一项。
我尝试过简单地选择项目。它最终会被选中但仍然不可见,除非您手动滚动到它。
答案 0 :(得分:24)
使用ListBox的ScrollIntoView方法传入最后一项。您可能需要立即调用UpdateLayout才能使其正常工作。
答案 1 :(得分:7)
ScrollIntoView()方法将最后一项滚动到视图中,但是必须在ScrollIntoView()之前调用listBox.UpdateLayout()。这是一个完整的代码方法:
// 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);
}
}
答案 2 :(得分:4)
稍微重构以减少代码行:
listBoxEvents.Add(item)
listBoxEvents.UpdateLayout()
listBoxEvents.ScrollIntoView(listBoxEvents.Items(listBoxEvents.Items.Count - 1))
答案 3 :(得分:0)
刚刚完成了这个,上面的解决方案都没有在Silverlight 5应用程序中运行。解决方案原来是这样的:
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);
}
}
}