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.