2009-11-15 10 views
7

Tengo un ListBox. Tiene un ScrollViewer interno, así que puedo desplazar el contenido de ListBox con la rueda del mouse. Funciona bien hasta que establezco una plantilla de elemento que contiene otro ListBox (de hecho, tengo 4 ListBoxes anidados =)). El problema es que el ScrollViewer interno de ListBox roba el evento de rueda. ¿Hay alguna manera fácil de prevenir este comportamiento?Cómo deshabilitar ScrollViewer en ListBox?


tuve ListBox con ItemContainerStyle así:

<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="BorderBrush" Value="Black"/> 
    ... 
</Style> 
<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}" /> 

¿Cómo puedo configurar el estilo de la frontera elemento de ItemContainer de recursos de este tipo? Como sé, ContentPresenter es un contenedor de elementos de ItemsControl. Pero no tiene Border, así que no puedo peinarlo.

Respuesta

40

Se puede quitar el ScrollViewer de un ListBox cambiando su plantilla de control a algo mucho más simple:

<ListBox> 
    <ListBox.Template> 
     <ControlTemplate> 
      <ItemsPresenter /> 
     </ControlTemplate> 
    </ListBox.Template> 
    ... 
</ListBox> 

Sin embargo, pongo en duda el valor de ListBoxes anidación. Recuerde que cada ListBox es un Selector y tiene un concepto de qué elemento está "seleccionado". ¿Realmente tiene sentido tener un elemento seleccionado dentro de un elemento seleccionado, dentro de un elemento seleccionado?

Sugeriría cambiar el "interior" ListBoxes al simple ItemsControls para que las listas anidadas no puedan tener elementos seleccionados. Eso haría una experiencia de usuario mucho más simple. Es posible que aún necesite volver a aplicar la plantilla ItemsControls de la misma manera para eliminar las barras de desplazamiento, pero al menos el usuario no se confundirá sobre qué elemento se "selecciona".

+0

_Does lo que realmente tiene sentido tener un elemento seleccionado dentro de un elemento seleccionado, dentro de un elemento seleccionado _ Sí. ¿De qué otro modo seleccionarías un elemento de una lista dentro de una lista dentro de una lista? – wotanii

+0

esto también elimina muchas otras cosas del cuadro de lista también, p. drop-events – wotanii

0

Lo siento por despertar una publicación tan antigua. En realidad, puede desactivar el ScrollViewer utilizando la propiedad adjunta de ScrollViewer.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
     ScrollViewer.VerticalScrollBarVisibility="Disabled" ... 
</ListBox> 
+4

Esto todavía parece robar el evento de rumbo – wotanii

+0

No funciona para mí :( – Sam

+0

No funciona para mí también. – Eftekhari

-1

¡Usted puede utilizar esto! Sin rueda robada.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ScrollViewer.VerticalScrollBarVisibility="Disabled" ... 
</ListBox> 
1

Puede desactivar el robo de eventos de desplazamiento por la captura de evento de desplazamiento en XAML:

<ListBox PreviewMouseWheel="ScrollViewer_PreviewMouseWheel"> 

y volver a publicarla en el Código atrás:

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     if (sender is ListBox && !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); 
     } 
    } 

La solución es exactamente para el cuadro de lista, me ayudó con ListView.

He encontrado esta solución aquí:?

https://social.msdn.microsoft.com/Forums/vstudio/en-US/3a3bb6b0-e088-494d-8ef2-60814415fd89/swallowing-mouse-scroll?forum=wpf

Cuestiones relacionadas