수색…
소개
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.Handled
를 true
로 설정하여 이벤트의 기본 동작을 방지합니다. 그런 다음 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
비헤이비어가 포함 된 내부 ScrollViewer
에 Behaviors
컬렉션을 연결된 속성으로 만듭니다.
이 특정 동작은 GridView
와 같은 포함 된 ScrollViewer
가 포함 된 기존 컨트롤에도 첨부 될 수 있으며 여전히 올바르게 작동합니다.