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
.