wpf
Comportements WPF
Recherche…
Introduction
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.