Suche…


Einführung

WPF-Verhalten ermöglicht es einem Entwickler, die Art und Weise zu ändern, wie WPF-Steuerelemente auf System- und Benutzerereignisse reagieren. Verhalten erben von der Behavior Klasse des System.Windows.Interactity Namespace. Dieser Namespace ist Teil des übergeordneten Expression Blend SDK, eine leichtere Version, die für Verhaltensbibliotheken geeignet ist, ist als [Nuget-Paket] [1] verfügbar. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Einfaches Verhalten zum Abfangen von Mausradereignissen

Verhalten implementieren

Dieses Verhalten führt dazu, dass Mausrad-Ereignisse von einem inneren ScrollViewer zum übergeordneten ScrollViewer wenn sich der innere an der oberen oder unteren Grenze befindet. Ohne dieses Verhalten werden die Ereignisse den inneren ScrollViewer niemals 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);
        }
    }
}

Behaviours subclass die Behavior<T> UIElement , wobei T der Typ des Steuerelements ist, mit dem es verbunden werden kann, in diesem Fall UIElement . Wenn das Behavior aus XAML instanziiert wird, wird die OnAttached Methode aufgerufen. Diese Methode ermöglicht es dem Verhalten, sich über Ereignisse (über AssociatedControl ) an Ereignisse AssociatedControl . Eine ähnliche Methode, OnDetached wird aufgerufen, wenn das Verhalten von dem zugeordneten Element getrennt werden muss. Eventuelle Handler sollten entfernt oder auf andere Weise Objekte entfernt werden, um Speicherlecks zu vermeiden.

Dieses Verhalten hängt mit dem PreviewMouseWheel Ereignis zusammen. Dadurch kann das Ereignis abgefangen werden, bevor der ScrollViewer die ScrollViewer hat, es zu sehen. Er prüft die Position, um zu sehen, ob das Ereignis in der visuellen ScrollViewer höhere Hierarchie von ScrollViewer werden muss. Wenn ja, wird e.Handled auf true , um die Standardaktion des Ereignisses zu verhindern. Anschließend wird ein neues MouseWheelEvent an AssociatedObject . Andernfalls wird das Ereignis normal weitergeleitet.


Anhängen des Verhaltens an ein Element in XAML

Zunächst muss der XML-Namespace für die interactivity in den Gültigkeitsbereich aufgenommen werden, bevor er in XAML verwendet werden kann. Fügen Sie den Namespaces Ihrer XAML die folgende Zeile hinzu.

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

Das Verhalten kann wie folgt angehängt werden:

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

Dadurch wird eine Behaviors als ScrollViewer Eigenschaft im inneren ScrollViewer , die ein BubbleMouseWheelEvents Verhalten enthält.

Dieses Verhalten kann auch an ein vorhandenes Steuerelement angehängt werden, das einen eingebetteten ScrollViewer enthält, z. B. eine GridView , und es funktioniert weiterhin ordnungsgemäß.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow