Поиск…


Вступление

Поведение WPF позволяет разработчику изменять способ управления WPF в ответ на системные и пользовательские события. Поведение наследуется от класса Behavior System.Windows.Interactity имен System.Windows.Interactity . Это пространство имен является частью всеобъемлющего SDK Expression Blend, но более легкая версия, подходящая для библиотек поведения, доступна в виде пакета [nuget] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

Простое поведение для перехвата событий колесика мыши

Внедрение поведения

Это приведет к тому, что события колесика мыши из внутреннего ScrollViewer пузыриться до родительского ScrollViewer когда внутренний находится на верхнем или нижнем пределе. Без такого поведения события никогда не выйдут из внутреннего 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 подклассом базового класса Behavior<T> , причем T является типом управления, к которому он может подключиться, в этом случае UIElement . Когда Behavior OnAttached из XAML, OnAttached метод OnAttached . Этот метод позволяет поведению подключаться к событиям из элемента управления, к которому он привязан (через AssociatedControl ). Аналогичный метод, OnDetached вызывается, когда поведение нужно отцеплять от связанного элемента. Необходимо принять меры для удаления любых обработчиков событий или иным образом очистить объекты, чтобы избежать утечек памяти.

Это поведение подключается к событию PreviewMouseWheel , что дает ему возможность перехватить событие, прежде чем ScrollViewer его увидеть. Он проверяет позицию, чтобы увидеть, нужно ли пересылать событие вверх по визуальному дереву на любую ScrollViewer высокую иерархию ScrollViewer . Если это так, он устанавливает e.Handled в true чтобы предотвратить действие по умолчанию для события. Затем он вызывает новый MouseWheelEvent перенаправленный в AssociatedObject . В противном случае событие маршрутизируется как обычно.


Прикрепление поведения к элементу в XAML

Во-первых, пространство XML-пространства interactivity должно быть введено в область до того, как оно будет использоваться в XAML. Добавьте следующую строку в пространства имен вашего XAML.

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

Поведение можно привязать так:

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

Это создает коллекцию Behaviors как Attached Property на внутреннем ScrollViewer который содержит поведение BubbleMouseWheelEvents .

Это конкретное поведение также может быть привязано к любому существующему ScrollViewer управления, содержащему встроенный ScrollViewer , такой как GridView , и он будет функционировать правильно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow