wpf
Comportamenti WPF
Ricerca…
introduzione
Behavior
dello spazio dei nomi System.Windows.Interactity
. Questo spazio dei nomi fa parte dell'esclusivo Expression Blend SDK, ma una versione più leggera, adatta alle librerie di comportamento, è disponibile come pacchetto [nuget] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/
Comportamento semplice per intercettare eventi della rotellina del mouse
Implementare il comportamento
Questo comportamento causerà gli eventi della rotellina del mouse da un ScrollViewer
interno ScrollViewer
a ScrollViewer
Bubble ScrollViewer
principale quando quello interno si trova al limite superiore o inferiore. Senza questo comportamento, gli eventi non usciranno mai dall'interno di ScrollViewer
.
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);
}
}
}
Behaviors sottoclasse il Behavior<T>
base-class, con T
è il tipo di controllo a cui è in grado di collegarsi, in questo caso UIElement
. Quando il Behavior
viene istanziato da XAML, viene chiamato il metodo OnAttached
. Questo metodo consente al comportamento di connettersi agli eventi dal controllo a cui è collegato (tramite AssociatedControl
). Un metodo simile, OnDetached
viene chiamato quando il comportamento deve essere sganciato dall'elemento associato. È necessario prestare attenzione per rimuovere eventuali gestori di eventi o pulire in altro modo oggetti per evitare perdite di memoria.
Questo comportamento si PreviewMouseWheel
all'evento PreviewMouseWheel
, che gli consente di intercettare l'evento prima che ScrollViewer
abbia la possibilità di vederlo. Controlla la posizione per vedere se è necessario inoltrare l'evento all'albero visivo a qualsiasi gerarchia superiore di ScrollViewer
. In tal caso, imposta e.Handled
su true
per impedire l'azione predefinita dell'evento. Quindi solleva un nuovo MouseWheelEvent
indirizzato a AssociatedObject
. Altrimenti, l'evento viene indirizzato normalmente.
Collegamento del comportamento a un elemento in XAML
Innanzitutto, l' interactivity
xml-namespace deve essere portata in ambito prima che possa essere utilizzata in XAML. Aggiungi la seguente riga ai namespace del tuo XAML.
xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "
Il comportamento può essere allegato in questo modo:
<ScrollViewer>
<!--...Content...-->
<ScrollViewer>
<interactivity:Interaction.Behaviors>
<behaviors:BubbleMouseWheelEvents />
</interactivity:Interaction.Behaviors>
<!--...Content...-->
</ScrollViewer>
<!--...Content...-->.
</ScrollViewer>
Ciò crea una collezione di Behaviors
come proprietà ScrollViewer
sul ScrollViewer
interno che contiene un comportamento di BubbleMouseWheelEvents
.
Questo particolare comportamento potrebbe anche essere collegato a qualsiasi controllo esistente che contiene un ScrollViewer
incorporato, come un GridView
, e funzionerebbe comunque correttamente.