Ricerca…


introduzione

I comportamenti WPF consentono a uno sviluppatore di modificare il modo in cui i controlli WPF agiscono in risposta a eventi di sistema e utente. I comportamenti ereditano dalla classe 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow