wpf listview scroll mouse

wpf - Activar desplazamiento horizontal con el mouse en ListView



scroll (2)

si implementa IScrollInfo puede anular MouseWheelUp para hacer MouseWheelLeft y down / right de la misma manera

editar (mucho más simple):

agregar a su ScrollViewer PreviewMouseWheel

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { if (e.Delta < 0) // wheel down { if (myScrollViewer.HorizontalOffset + e.Delta > 0) { myScrollViewer.ScrollToHorizontalOffset(myScrollViewer.HorizontalOffset + e.Delta); } else { myScrollViewer.ScrollToLeftEnd(); } } else //wheel up { if (myScrollViewer.ExtentWidth > myScrollViewer.HorizontalOffset + e.Delta) { myScrollViewer.ScrollToHorizontalOffset(myScrollViewer.HorizontalOffset + e.Delta); } else { myScrollViewer.ScrollToRightEnd(); } } }

xaml:

<ScrollViewer x:Name="myScrollViewer" HorizontalScrollBarVisibility="Visible" Mouse.PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">

Tengo un ListView horizontal personalizado con ScrollViewer personalizado dentro de su plantilla (creado con Blend). Quiero que se desplace horizontalmente cuando use la rueda de desplazamiento del mouse. ¿Cómo puedo hacer eso?


Esto se debe hacer con un Behavior para una mayor reutilización. Además, la lógica de ZSH es redundante y podría simplificarse. Aquí está mi código:

/// <summary> /// Allows an <see cref="ItemsControl"/> to scroll horizontally by listening to the /// <see cref="PreviewMouseWheel"/> event of its internal <see cref="ScrollViewer"/>. /// </summary> public class HorizontalScrollBehavior : Behavior<ItemsControl> { /// <summary> /// A reference to the internal ScrollViewer. /// </summary> private ScrollViewer ScrollViewer { get; set; } /// <summary> /// By default, scrolling down on the wheel translates to right, and up to left. /// Set this to true to invert that translation. /// </summary> public bool IsInverted { get; set; } /// <summary> /// The ScrollViewer is not available in the visual tree until the control is loaded. /// </summary> protected override void OnAttached() { base.OnAttached(); AssociatedObject.Loaded += OnLoaded; } private void OnLoaded(object sender, RoutedEventArgs e) { AssociatedObject.Loaded -= OnLoaded; ScrollViewer = VisualTreeHelpers.FindVisualChild<ScrollViewer>(AssociatedObject); if (ScrollViewer != null) { ScrollViewer.PreviewMouseWheel += OnPreviewMouseWheel; } } protected override void OnDetaching() { base.OnDetaching(); if (ScrollViewer != null) { ScrollViewer.PreviewMouseWheel -= OnPreviewMouseWheel; } } private void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e) { var newOffset = IsInverted ? ScrollViewer.HorizontalOffset + e.Delta : ScrollViewer.HorizontalOffset - e.Delta; ScrollViewer.ScrollToHorizontalOffset(newOffset); } }

Necesitará agregar las siguientes referencias: System.Windows , System.Windows.Controls , System.Windows.Input , y es posible que necesite obtener el paquete Blend SDK NuGet, y buscar y hacer referencia al archivo DLL System.Windows.Interactivity en la sección Extensiones de ensamblajes.

Use esto para VisualTreeHelpers :

public class VisualTreeHelpers { /// <summary> /// Return the first visual child of element by type. /// </summary> /// <typeparam name="T">The type of the Child</typeparam> /// <param name="obj">The parent Element</param> public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) return (T)child; else { T childOfChild = FindVisualChild<T>(child); if (childOfChild != null) return childOfChild; } } return null; } }

Referencia: https://codereview.stackexchange.com/questions/44760/is-there-a-better-way-to-get-a-child

Tenga en cuenta que NO es lo mismo que VisualTreeHelper en Windows.System.Media .

Así es cómo usarlo en XAML:

<ListBox> <i:Interaction.Behaviors> <behaviors:HorizontalScrollBehavior /> </i:Interaction.Behaviors> </ListBox>

Donde el espacio de nombres i se declara como xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" y

behaviors se declara como

xmlns:behaviors="clr-namespace:MyNamespace"

donde MyNamespace es el espacio de nombres que contiene la clase HorizontalScrollBehavior .