2008-11-04 17 views

Répondre

3

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.

5

De l'intérieur d'une classe qui hérite de la classe ListBox, vous pouvez utiliser le GetTemplateChild protégé():

var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;

Si vous souhaitez accéder depuis l'extérieur de la zone de liste, puis en exposant ScrollViewer via un La propriété devrait fonctionner, encore une fois par l'héritage. CAVEAT: Si vous avez défini votre propre modèle personnalisé, ce Scrollviewer peut ne pas exister. Vous pouvez utiliser le nom Scrollviewer des modèles à la place de "ScrollViewer" dans la méthode ci-dessus.

+0

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 –

+0

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

+0

Cela ne fonctionne pas et ne devrait pas être tenté. GetTemplateChild est une méthode protégée. – Kevin

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

est nulle si aucun datasourse réglé sur la zone de liste, dans mon cas, il retourne correctement l'interface utilisateur Élément seulement après sous le code exécuté

myListBox.ItemsSource = list; 
0

Vous pouvez appeler:

myListBox.ApplyTemplate(); 

pour forcer l'arborescence visuelle ListBox à créer, sinon GetTemplateChild() renverra Null si vous tentez d'y accéder immédiatement.

Cela fonctionne bien combiné avec "Erno de Weerd" explication: hériter ListBox pour être en mesure d'appeler la méthode GetTemplateChild().

J'ai aussi essayé:

  • d'utiliser la méthode d'extension ListBox "GetScrollHost()" mais il n'a jamais travaillé pour moi (même après initialisations pleine page).
  • "FindName()", mais cela n'a pas fonctionné, même lorsque j'ai spécifié le nom ScrollViewer dans le modèle ListBox.

Emmanuel (Silverlight 3)

1

Faisons facilement ... Dans votre modèle Listbox, vous trouverez peut-être le contrôle ScrollViewer. Ajouter une méthode Loaded pour cela, et vous obtiendrez lui-même à partir de l'argument de l'expéditeur.

private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myScrollViewer = (sender as ScrollViewer); 
    } 

cela fonctionne pour moi