프로그래밍/WPF

[WPF] MouseWheel Delta Binding

흔한티벳여우 2022. 8. 22. 17:08
반응형

InputBinding으로 보통 마우스 클릭 위주로 바인딩은 쉽다.

하지만 MouseWheel의 Up Down의 경우 MVVM 으로 바인딩하려면 다른방법을 써야한다.

Behavior를 이용하는 방법인데 이는 아래와 같다.

 

일단 MouseWheel의 Argument를 가져오기 위해 어떤 클래스를 상속해야하는지 확인해보자.

https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.uielement.mousewheel?view=windowsdesktop-6.0 

 

UIElement.MouseWheel 이벤트 (System.Windows)

마우스 포인터가 이 요소 위에 있는 동안 사용자가 마우스 휠을 굴리면 발생합니다.

docs.microsoft.com

위와 같이 MouseWheel Event는 UIElement에서 내려오는것을 확인할 수 있다.

그럼 Behavior 클래스를 만들어보자.

 

public class MouseWheelEventBehavior : Behavior<UIElement>
{
    public int Delta
    {
        get { return (int)GetValue(DeltaProperty); }
        set { SetValue(DeltaProperty, value); }
    }

    public static readonly DependencyProperty DeltaProperty =
        DependencyProperty.Register("Delta", typeof(int), typeof(MouseWheelEventBehavior));


    protected override void OnAttached()
    {
        base.OnAttached();

        this.AssociatedObject.MouseWheel += AssociatedObject_MouseWheel;
    }

    private void AssociatedObject_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
    {
        this.Delta = e.Delta;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        if (this.AssociatedObject != null)
        {
            this.AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel;
        }
    }
}

 

DependencyProperty로  바인딩할 Delta를 선언해주고, 마우스 휠 이벤트가 발생될 때마다 Delta값을 바인딩 처리해준다.

 

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

부모에 위와 같이 추가해주고

 

<ListBox>
    <i:Interaction.Behaviors>
        <b:MouseWheelEventBehavior Delta="{Binding Delta, Mode=TwoWay}"/>
    </i:Interaction.Behaviors>
</ListBox>

위와 같이 바인딩 처리를 해주면된다.

끝!!

반응형