수색…


소개

WPF 비헤이비어를 사용하면 개발자가 시스템 및 사용자 이벤트에 대한 응답으로 WPF 컨트롤의 작동 방식을 변경할 수 있습니다. 동작은 System.Windows.Interactity 네임 스페이스의 Behavior 클래스에서 상속됩니다. 이 네임 스페이스는 가장 중요한 Expression Blend SDK의 일부이지만 비헤이비어 라이브러리에 적합한 더 가벼운 버전은 [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> 기본 클래스를 하위 클래스로 Behavior<T> 습니다. T 는이 클래스에 첨부 할 수있는 컨트롤 유형 (이 경우 UIElement 입니다. XAML에서 Behavior 을 인스턴스화하면 OnAttached 메서드가 호출됩니다. 이 메서드를 사용하면 연결된 컨트롤에서 AssociatedControl 통해 이벤트에 후크 할 수 있습니다. 유사한 메서드 인 OnDetached 는 관련 요소에서 비헤이비어가 해제되어야 할 때 호출됩니다. 이벤트 핸들러를 제거하거나 메모리 누출을 피하기 위해 오브젝트를 정리하려면주의를 기울여야합니다.

이 동작은 PreviewMouseWheel 이벤트에 연결되어 ScrollViewer 가 이벤트를보기 전에 변경 사항을 가로 챌 수 있습니다. 위치를 확인하여 비주얼 트리 위로 이벤트를 ScrollViewer 상위 계층으로 전달 ScrollViewer 합니다. 그렇다면 e.Handledtrue 로 설정하여 이벤트의 기본 동작을 방지합니다. 그런 다음 AssociatedObject 라우트 된 새로운 MouseWheelEvent 를 발생시킵니다. 그렇지 않으면 이벤트가 정상적으로 라우팅됩니다.


XAML의 요소에 비헤이비어 첨부

먼저 XAML에서 interactivity xml-namespace를 사용하기 전에 범위에 가져와야합니다. XAML의 네임 스페이스에 다음 줄을 추가합니다.

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

동작은 다음과 같이 첨부 할 수 있습니다.

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

BubbleMouseWheelEvents 비헤이비어가 포함 된 내부 ScrollViewerBehaviors 컬렉션을 연결된 속성으로 만듭니다.

이 특정 동작은 GridView 와 같은 포함 된 ScrollViewer 가 포함 된 기존 컨트롤에도 첨부 될 수 있으며 여전히 올바르게 작동합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow