Buena pregunta. No encontré una manera de hacerlo directamente, pero me acerqué bastante al mirar el proyecto de Silverlight Controls (usan el scrollviewer en el control de elementos en algunas de las clases). Aquí es cómo puede conseguirlo, pero requiere de un cuadro de lista personalizada:
public class TestBox : ListBox
{
private ScrollViewer _scrollHost;
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
var itemsHost = VisualTreeHelper.GetParent(element) as Panel;
for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj))
{
ScrollViewer viewer = obj as ScrollViewer;
if (viewer != null)
{
_scrollHost = viewer;
break;
}
}
base.PrepareContainerForItemOverride(element, item);
}
}
Puede haber otra forma de gancho en ese evento (o otra manera de conseguir que el panel), Si nos fijamos en la plantilla para el ListBox verá que el visor de desplazamiento en realidad se llama "ScrollViewer", sin embargo, el método GetTemplateChild está protegido, por lo que aún tendría que crear una clase personalizada.
GetTemplateChild muestra ser un método protegido. ¿Es eso nuevo? porque ahora parece que tu solución ya no funcionará. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –
No estoy seguro, pero supongo que tendrá que crear una propiedad en un clase heredera Esto es lo que hice al final si recuerdo correctamente; era una lista personalizada de todos modos. – Dann
Esto realmente no funciona y no debe intentarse. GetTemplateChild es un método protegido. – Kevin