Recherche…


Introduction

Les comportements WPF permettent à un développeur de modifier la manière dont les contrôles WPF agissent en réponse aux événements système et utilisateur. Les comportements héritent de la classe Behavior de l'espace de noms System.Windows.Interactity . Cet espace de noms fait partie du SDK Expression Blend global, mais une version plus légère, adaptée aux bibliothèques de comportement, est disponible sous la forme [package nuget] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Comportement simple pour intercepter les événements de la molette de la souris

Mise en œuvre du comportement

Ce comportement entraînera une ScrollViewer événements de la molette de la souris depuis un ScrollViewer interne vers le ScrollViewer parent lorsque celui-ci se trouve à sa limite supérieure ou inférieure. Sans ce comportement, les événements ne pourront jamais sortir du ScrollViewer interne.

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

Comportements sous-classe de la classe de base Behavior<T> , T étant le type de contrôle auquel il peut être associé, dans ce cas UIElement . Lorsque le Behavior est instancié à partir de XAML, la méthode OnAttached est appelée. Cette méthode permet au comportement de se connecter aux événements à partir du contrôle auquel il est associé (via AssociatedControl ). Une méthode similaire, OnDetached est appelée lorsque le comportement doit être décroché de l'élément associé. Des précautions doivent être prises pour supprimer tous les gestionnaires d'événements ou pour nettoyer les objets afin d'éviter les fuites de mémoire.

Ce comportement s'intègre à l'événement PreviewMouseWheel , ce qui lui permet d'intercepter l'événement avant que ScrollViewer puisse le voir. Il vérifie la position pour voir s'il doit transférer l'événement dans l'arborescence visuelle à une hiérarchie supérieure de ScrollViewer . Si c'est le cas, il définit e.Handled sur true pour empêcher l'action par défaut de l'événement. Il déclenche ensuite un nouveau MouseWheelEvent routé vers AssociatedObject . Sinon, l'événement est routé normalement.


Attacher le comportement à un élément dans XAML

Tout d'abord, l'espace de noms XML d' interactivity doit être étendu à la portée avant de pouvoir être utilisé dans XAML. Ajoutez la ligne suivante aux espaces de noms de votre XAML.

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

Le comportement peut être attaché comme suit:

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

Cela crée une collection de Behaviors tant que propriété attachée sur le ScrollViewer interne qui contient un comportement BubbleMouseWheelEvents .

Ce comportement particulier pourrait également être associé à tout contrôle existant contenant un ScrollViewer intégré, tel qu'un GridView , et il fonctionnerait toujours correctement.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow