Вам нужно овладеть ScrollViewer
, который используется ListBox
внутри, чтобы вы могли получить значение свойства VerticalOffset
и впоследствии вызвать метод SetVerticalOffset
.
Для этого необходимо, чтобы вы достигли уровня ListBox
через дерево визуалов, составляющее его внутренности.
Я использую этот удобный класс расширений, который вы должны добавить в свой проект (я должен поместить это в блог, потому что я повторяю его): -
public static class VisualTreeEnumeration
{
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
if (depth > 0)
{
foreach (var descendent in Descendents(child, --depth))
yield return descendent;
}
}
}
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
{
return Descendents(root, Int32.MaxValue);
}
public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root)
{
DependencyObject current = VisualTreeHelper.GetParent(root);
while (current != null)
{
yield return current;
current = VisualTreeHelper.GetParent(current);
}
}
}
Имея это в наличии, ListBox
(и все другие элементы UIE в этом отношении) получает пару новых методов расширения Descendents
и Ancestors
. Мы можем объединить их с Linq для поиска вещей. В этом случае вы можете использовать: -
ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();