Zoeken…


Invoering

WPF-gedragingen stellen een ontwikkelaar in staat om de manier te veranderen waarop WPF-controles werken in reactie op systeem- en gebruikersgebeurtenissen. Gedrag erven van de klasse Behavior van de naamruimte System.Windows.Interactity . Deze naamruimte maakt deel uit van de overkoepelende Expression Blend SDK, maar een lichtere versie, geschikt voor gedragsbibliotheken, is beschikbaar als een [nuget-pakket] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Eenvoudig gedrag om muiswielgebeurtenissen te onderscheppen

Het gedrag implementeren

Dit gedrag zorgt ervoor dat muiswielgebeurtenissen vanuit een interne ScrollViewer naar de bovenliggende ScrollViewer wanneer de binnenste de bovenste of onderste limiet heeft. Zonder dit gedrag zullen de gebeurtenissen nooit uit de inner 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);
        }
    }
}

Gedrag subklasse van de basisklasse Behavior<T> , waarbij T het type besturingselement is waaraan het kan koppelen, in dit geval UIElement . Wanneer het Behavior wordt geïnstantieerd vanuit XAML, wordt de methode OnAttached aangeroepen. Met deze methode kan het gedrag worden gekoppeld aan gebeurtenissen van het besturingselement waaraan het is gekoppeld (via AssociatedControl ). Een vergelijkbare methode, OnDetached wordt aangeroepen wanneer het gedrag moet worden losgemaakt van het bijbehorende element. Zorg ervoor dat u event-handlers verwijdert of op een andere manier objecten opruimt om geheugenlekken te voorkomen.

Dit gedrag PreviewMouseWheel gebeurtenis PreviewMouseWheel , waardoor deze de gebeurtenis kan onderscheppen voordat de ScrollViewer kans krijgt deze te zien. Het controleert de positie om te zien of het de gebeurtenis omhoog door de visuele boom moet ScrollViewer naar een hogere hiërarchie van ScrollViewer . Als dit het geval is, wordt e.Handled op true om de standaardactie van de gebeurtenis te voorkomen. Vervolgens wordt een nieuwe MouseWheelEvent gerouteerd die naar AssociatedObject gerouteerd. Anders wordt de gebeurtenis normaal doorgestuurd.


Het gedrag koppelen aan een element in XAML

Eerst moet de interactivity xml-namespace in scope worden gebracht voordat deze in XAML kan worden gebruikt. Voeg de volgende regel toe aan de naamruimten van uw XAML.

xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "

Het gedrag kan als volgt worden bevestigd:

<ScrollViewer>
    <!--...Content...-->
    <ScrollViewer>
        <interactivity:Interaction.Behaviors>
            <behaviors:BubbleMouseWheelEvents />
        </interactivity:Interaction.Behaviors>
        <!--...Content...-->
    </ScrollViewer>
    <!--...Content...-->.
</ScrollViewer>

Dit creëert een Behaviors collectie als een bijgevoegde Property op de binnenste ScrollViewer dat een bevat BubbleMouseWheelEvents gedrag.

Dit specifieke gedrag kan ook worden gekoppeld aan elk bestaand besturingselement dat een ingesloten ScrollViewer bevat, zoals een GridView , en het zou nog steeds correct werken.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow