Sök…


Introduktion

WPF-beteenden tillåter en utvecklare att ändra hur WPF kontrollerar agerar som svar på system- och användarhändelser. Beteenden ärver från Behavior i System.Windows.Interactity namnområdet. Detta namnutrymme är en del av det övergripande Expression Blend SDK, men en lättare version, lämplig för beteendebibliotek, finns som ett [nuget-paket] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Enkelt beteende för att fånga händelser med mushjul

Implementera beteendet

Detta beteende kommer att göra att mushjulshändelser från en inre ScrollViewer upp till överordnade ScrollViewer när den inre är antingen vid den övre eller nedre gränsen. Utan detta beteende kommer händelserna aldrig att komma ut ur den inre 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);
        }
    }
}

Beteenden underklasserar Behavior<T> basklassen, där T är den typ av kontroll som den kan koppla till, i detta fall UIElement . När Behavior inställs från XAML OnAttached metoden. Denna metod tillåter beteendet att ansluta till händelser från kontrollen det är kopplat till (via AssociatedControl ). En liknande metod, OnDetached kallas när beteendet måste hakad från det tillhörande elementet. Se till att ta bort eventuella hanterare av händelser eller på annat sätt rensa upp föremål för att undvika minnesläckor.

Detta beteende PreviewMouseWheel händelsen PreviewMouseWheel , vilket ger det en förändring att fånga upp händelsen innan ScrollViewer har en chans att se den. Den kontrollerar positionen för att se om den behöver vidarebefordra händelsen upp det visuella trädet till någon ScrollViewer högre hierarki. Om så är e.Handled ställer den e.Handledtrue att förhindra händelsens standardåtgärd. Den höjer sedan en ny MouseWheelEvent dirigeras till AssociatedObject . Annars dirigeras händelsen som normalt.


Fästa beteendet till ett element i XAML

Först måste interactivity xml-namnutrymmet bringas till omfattning innan det kan användas i XAML. Lägg till följande rad i namnytorna på din XAML.

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

Beteendet kan kopplas på så sätt:

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

Detta skapar en Behaviors samling som en bifogad egenskap i den inre ScrollViewer som innehåller ett BubbleMouseWheelEvents beteende.

Detta specifika beteende kan också knytas till alla befintliga kontroller som innehåller en inbäddad ScrollViewer , till exempel en GridView , och det skulle fortfarande fungera korrekt.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow