Bonne question. Je n'ai pas trouvé un moyen de le faire directement, mais je suis arrivé assez près en regardant le projet Silverlight Controls (ils utilisent le scrollviewer sur le contrôle des objets dans certaines classes). Voici comment vous pouvez l'obtenir, mais il faut une zone de liste personnalisée:
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);
}
}
Il pourrait y avoir une autre façon de connecter en cet événement (ou d'une autre façon d'obtenir ce panneau), Si vous regardez le modèle pour la ListBox vous verrez que la visionneuse de défilement est en réalité nommée "ScrollViewer", cependant la méthode GetTemplateChild est protégée de sorte que vous devrez toujours créer une classe personnalisée.
GetTemplateChild révèle être une méthode protégée. Est-ce nouveau? parce que maintenant, il semble que votre solution ne fonctionnera plus. http://msdn.microsoft.com/fr-fr/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –
Pas sûr, mais je suppose que vous devrez créer une propriété sur un héritant de la classe. C'est ce que j'ai fait à la fin si je me souviens bien; c'était une liste personnalisée de toute façon. – Dann
Cela ne fonctionne pas et ne devrait pas être tenté. GetTemplateChild est une méthode protégée. – Kevin