Ответ 1
Используйте метод ListBox ScrollIntoView, проходящий в последнем элементе. Возможно, вам придется вызвать UpdateLayout непосредственно перед тем, как он будет работать.
Как я могу программным образом заставить окно списка Silverlight прокручиваться вниз, чтобы последний добавленный элемент всегда был видимым.
Я попробовал просто выбрать элемент. Он заканчивается как выбранный, но все еще не отображается, если вы не вручную просмотрите его.
Используйте метод ListBox ScrollIntoView, проходящий в последнем элементе. Возможно, вам придется вызвать UpdateLayout непосредственно перед тем, как он будет работать.
Метод ScrollIntoView() будет прокручивать последний элемент в представлении, однако listBox.UpdateLayout() должен быть вызван непосредственно перед ScrollIntoView(). Вот полный метод с кодом:
// 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);
}
}
Слегка реорганизован для сокращения строк кода:
listBoxEvents.Add(item)
listBoxEvents.UpdateLayout()
listBoxEvents.ScrollIntoView(listBoxEvents.Items(listBoxEvents.Items.Count - 1))
Просто прошел это, и ни одно из вышеперечисленных решений не работало в приложении 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);
}
}
}