wpf
Comportamientos de WPF
Buscar..
Introducción
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.