2010-08-17 4 views
12

Je me demandais s'il est possible de désactiver facilement le ScrollViewer de TreeView.WPF Supprimer ScrollViewer de TreeView

J'ai un UserControl avec une grille. Une des cellules a quelques TreeViews à l'intérieur d'un Stackpanel. La hauteur des tailles de contrôle dépend automatiquement de la hauteur des TreeViews, il n'y a donc pas besoin d'une barre de défilement. Le problème est: j'en ai beaucoup dans un ListBox avec son propre ScrollViewer, mais lorsque j'utilise le MouseWheel, le défilement s'arrête quand vous êtes sur un TreeView. Ceci est dû au fait que TreeView possède son propre ScrollViewer qui vole la MouseWheel. Je sais que c'est probablement possible en remplaçant le modèle de contrôle, mais j'espère qu'il y a un moyen plus facile.

Répondre

30

Vous pouvez utiliser la technique décrite ici: http://serialseb.blogspot.com/2007/09/wpf-tips-6-preventing-scrollviewer-from.html pour empêcher les événements de roulette de la souris d'être gérés par le ScrollViewer. Ajouter PreviewMouseWheel="HandlePreviewMouseWheel" à votre TreeView et définir HandlePreviewMouseWheel comme:

private void HandlePreviewMouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    if (!e.Handled) 
    { 
     e.Handled = true; 
     var eventArg = new MouseWheelEventArgs(
      e.MouseDevice, e.Timestamp, e.Delta); 
     eventArg.RoutedEvent = UIElement.MouseWheelEvent; 
     eventArg.Source = sender; 
     var parent = ((Control)sender).Parent as UIElement; 
     parent.RaiseEvent(eventArg); 
    } 
} 

Modification du modèle de contrôle pour inclure non un ScrollViewer est pas difficile, cependant, puisque le modèle par défaut pour TreeView est assez simple, et la plupart de la complexité est gérer le ScrollViewer. Essayez de faire ceci:

<TreeView.Template> 
    <ControlTemplate TargetType="TreeView"> 
     <Border BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="true"> 
      <ItemsPresenter/> 
     </Border> 
    </ControlTemplate> 
</TreeView.Template> 
+0

Hmm, il semble que mon dernier commentaire n'a pas fonctionné. Quoi qu'il en soit, merci! J'ai essayé les deux. Le modèle de contrôle de xaml a fonctionné parfaitement, mais le PreviewMouseWheel est resté "bloqué" plusieurs fois pendant le défilement. Je vais aller avec la solution xaml. – user380527

+6

+1 pour la solution XAML (également travaillé avec le même problème) – JanW