Necesitas controlar la ScrollViewer
que se utiliza por el ListBox
internamente para que pueda tomar el valor de la propiedad VerticalOffset
y posteriormente llamar al método SetVerticalOffset
.
Esto requiere que alcance desde el ListBox
a través del árbol visual que compone su interior.
que utilizan esta clase práctica extensión que se debe agregar al proyecto (Tengo que poner esto en un blog porque sigo repitiéndolo): -
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);
}
}
}
Con esta disposición el ListBox
(y todos los demás elementos UIE para ese asunto) recibe un par de nuevos métodos de extensión Descendents
y Ancestors
. Podemos combinarlos con Linq para buscar cosas. En este caso, puede usar: -
ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();
¡Gracias amablemente! Ni siquiera me di cuenta de que el maquillaje de los controles podía ser navegado de esta manera. –
entonces, ¿cómo sabes cuándo usar esa información? ¿Cómo sabe una página que está siendo restaurada de un tumulto sin saltar a través de un montón de aros? – Roger
@Roger: He leído sobre este tema de MSDN: http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones