Musisz zdobyć na ScrollViewer
, który jest używany przez ListBox
wewnętrznie więc można pobrać wartość właściwości VerticalOffset
a następnie wywołać metodę SetVerticalOffset
.
Wymagane jest przejście od ListBox
przez drzewo wizualne, które tworzy jego elementy wewnętrzne.
Używam tego poręczny klasę przedłużacza, który należy dodać do projektu (Muszę położyć się na tym blogu, bo go powtarzać): -
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);
}
}
}
Z tego udostępnienia ListBox
(i wszystkie inne UIElements w tej sprawie) otrzymuje kilka nowych metod rozszerzenia Descendents
i Ancestors
. Możemy połączyć te z Linq, aby wyszukać rzeczy. W takim przypadku możesz użyć: -
ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();
Dziękuję uprzejmie! Nawet nie zdawałem sobie sprawy, że makijaż kontrolny może być nawigowany w ten sposób. –
, więc skąd wiadomo, kiedy używać tych informacji? W jaki sposób strona wie, że została przywrócona z tombstoningu, nie przeskakując przez kilka obręczy? – Roger
@Roger: Czytałem na ten temat MSDN: http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones