Buscar..


Introducción

Los comportamientos de WPF permiten que un desarrollador altere la forma en que WPF controla los actos en respuesta a los eventos del sistema y del usuario. Los comportamientos se heredan de la clase Behavior del espacio de nombres System.Windows.Interactity . Este espacio de nombres es una parte del SDK de Expression Blend general, pero una versión más liviana, adecuada para bibliotecas de comportamiento, está disponible como [paquete de nuget] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Comportamiento simple para interceptar eventos de la rueda del ratón

Implementando el Comportamiento

Este comportamiento provocará que los eventos de la rueda del ratón desde un ScrollViewer interno ScrollViewer hasta el ScrollViewer principal cuando el interno esté en su límite superior o inferior. Sin este comportamiento, los eventos nunca saldrán del ScrollViewer interno.

public class BubbleMouseWheelEvents : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.PreviewMouseWheel += PreviewMouseWheel;
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.PreviewMouseWheel -= PreviewMouseWheel;
        base.OnDetaching();
    }

    private void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var scrollViewer = AssociatedObject.GetChildOf<ScrollViewer>(includeSelf: true);
        var scrollPos = scrollViewer.ContentVerticalOffset;
        if ((scrollPos == scrollViewer.ScrollableHeight && e.Delta < 0) || (scrollPos == 0 && e.Delta > 0))
        {
            UIElement rerouteTo = AssociatedObject;
            if (ReferenceEquals(scrollViewer, AssociatedObject))
            {
                rerouteTo = (UIElement) VisualTreeHelper.GetParent(AssociatedObject);
            }

            e.Handled = true;
            var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
            e2.RoutedEvent = UIElement.MouseWheelEvent;
            rerouteTo.RaiseEvent(e2);
        }
    }
}

Comportamientos subclase la clase base de Behavior<T> , siendo T el tipo de control al que se puede adjuntar, en este caso UIElement . Cuando el Behavior se crea desde XAML, se OnAttached método OnAttached . Este método permite que el comportamiento se enganche a los eventos del control al que se adjunta (a través de AssociatedControl ). Un método similar, se llama a OnDetached cuando el comportamiento debe ser desconectado del elemento asociado. Se debe tener cuidado de eliminar cualquier controlador de eventos, o de lo contrario limpiar objetos para evitar pérdidas de memoria.

Este comportamiento se engancha al evento PreviewMouseWheel , que le da un cambio para interceptar el evento antes de que ScrollViewer tenga la oportunidad de verlo. Verifica la posición para ver si necesita reenviar el evento hacia arriba del árbol visual a cualquier jerarquía superior de ScrollViewer . Si es así, establece e.Handled en true para evitar la acción predeterminada del evento. A continuación, genera un nuevo MouseWheelEvent enrutado a AssociatedObject . De lo contrario, el evento se enruta de forma normal.


Adjuntando el comportamiento a un elemento en XAML

Primero, el espacio de nombres xml de interactivity debe colocar en el ámbito antes de poder utilizarlo en XAML. Agregue la siguiente línea a los espacios de nombres de su XAML.

xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "

El comportamiento se puede adjuntar así:

<ScrollViewer>
    <!--...Content...-->
    <ScrollViewer>
        <interactivity:Interaction.Behaviors>
            <behaviors:BubbleMouseWheelEvents />
        </interactivity:Interaction.Behaviors>
        <!--...Content...-->
    </ScrollViewer>
    <!--...Content...-->.
</ScrollViewer>

Esto crea una colección de Behaviors como una propiedad adjunta en el ScrollViewer interno que contiene un comportamiento de BubbleMouseWheelEvents .

Este comportamiento en particular también podría adjuntarse a cualquier control existente que contenga un ScrollViewer incorporado, como un GridView , y aún funcionaría correctamente.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow