2010-08-17 11 views
12

Me preguntaba si es posible apagar el ScrollViewer de TreeView fácilmente.WPF Eliminar ScrollViewer de TreeView

Tengo un UserControl con una cuadrícula. Una de las Celdas tiene algunas TreeViews dentro de un Stackpanel. La altura de los controles depende automáticamente de la altura de TreeViews, por lo que no es necesario utilizar una barra de desplazamiento.

El problema es que tengo un montón de estos en un ListBox con su propio ScrollViewer, pero cuando estoy usando el MouseWheel, el desplazamiento se detiene cuando está sobre un TreeView.

Esto se debe a que el TreeView tiene su propio ScrollViewer que roba el MouseWheel. Sé que esto probablemente sea posible anulando la plantilla de control, pero espero que haya una manera más fácil.

Respuesta

30

Puede utilizar la técnica que se describe aquí: http://serialseb.blogspot.com/2007/09/wpf-tips-6-preventing-scrollviewer-from.html para evitar que el ScrollViewer maneje los eventos de la rueda del mouse. Añadir PreviewMouseWheel="HandlePreviewMouseWheel" a su TreeView y definir HandlePreviewMouseWheel como:

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

Cambio de la plantilla de control para que no incluya un ScrollViewer no es tan difícil, sin embargo, ya que la plantilla predeterminada para TreeView es bastante simple, y la mayor parte de la complejidad es manejo del ScrollViewer. Intente hacer esto:

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

Hmm, parece que mi último comentario no funcionó. De todos modos, gracias! Intenté ambos. La plantilla de control xaml funcionaba perfectamente, pero PreviewMouseWheel aún se "atascó" un par de veces mientras se desplazaba. Iré con la solución xaml. – user380527

+6

+1 para XAML Solution (también funcionó perfecto con el mismo problema) – JanW