2010-08-17 15 views
12

Ich frage mich, ob es möglich ist, den ScrollViewer der TreeView einfach auszuschalten.WPF ScrollViewer von TreeView entfernen

Ich habe ein UserControl mit einem Raster. Eine der Zellen hat ein paar TreeViews in einem Stackpanel. Die Höhe der Control-Größen richtet sich automatisch nach der Höhe der TreeViews, so dass keine Scrollbar benötigt wird.

Das Problem ist: Ich habe eine Reihe von diesen in einer ListBox mit eigenen ScrollViewer, aber wenn ich das MouseWheel verwende, stoppt das Scrollen, wenn Sie über eine TreeView sind.

Dies ist, weil das TreeView seinen eigenen ScrollViewer hat, der das MouseWheel stiehlt. Ich weiß, dass dies wahrscheinlich durch Überschreiben der Kontrollvorlage möglich ist, aber ich hoffe, dass es einen einfacheren Weg gibt.

Antwort

30

Sie können die hier beschriebene Technik verwenden: http://serialseb.blogspot.com/2007/09/wpf-tips-6-preventing-scrollviewer-from.html, um zu verhindern, dass Mausrad-Ereignisse vom ScrollViewer verarbeitet werden. In PreviewMouseWheel="HandlePreviewMouseWheel" zu Ihrem TreeView und definieren HandlePreviewMouseWheel als:

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); 
    } 
} 

die Steuervorlage ändern nicht enthalten ein Scroll nicht so schwer ist, obwohl, da die Standardvorlage für TreeView ist ziemlich einfach, und die meisten der Komplexität Umgang mit dem ScrollViewer. Versuchen Sie Folgendes:

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

Hmm, es scheint, dass mein letzter Kommentar nicht funktioniert. Wie auch immer, danke! Ich habe beides versucht. Die XAML Control-Vorlage funktionierte perfekt, aber das PreviewMouseWheel blieb beim Scrollen ein paar Mal hängen. Ich werde mit der XAML-Lösung gehen. – user380527

+6

+1 für XAML-Lösung (funktionierte auch perfekt mit dem gleichen Problem) – JanW