Szukaj…
Wprowadzenie
Behavior
przestrzeni nazw System.Windows.Interactity
. Ta przestrzeń nazw jest częścią nadrzędnego zestawu SDK Expression Blend, ale lżejsza wersja, odpowiednia dla bibliotek zachowania, jest dostępna jako [pakiet nuget] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/
Proste zachowanie do przechwytywania zdarzeń kółka myszy
Wdrażanie zachowania
To zachowanie spowoduje, że zdarzenia kółka myszy z wewnętrznego ScrollViewer
będą się ScrollViewer
do nadrzędnego ScrollViewer
gdy wewnętrzny znajdzie się na górnej lub dolnej granicy. Bez tego zachowania zdarzenia nigdy nie wyjdą z wewnętrznego 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);
}
}
}
Zachowania stanowią podklasę klasy bazowej Behavior<T>
, przy czym T
jest rodzajem kontroli, do której może się przyłączyć, w tym przypadku UIElement
. Kiedy instancja Behavior
jest utworzona z XAML, OnAttached
jest metoda OnAttached
. Ta metoda umożliwia zachowanie się połączenia z zdarzeniami z kontrolki, do której jest przyłączony (poprzez AssociatedControl
). Podobną metodę OnDetached
się, gdy zachowanie musi zostać odłączone od powiązanego elementu. Należy zachować ostrożność, aby usunąć programy obsługi zdarzeń lub w inny sposób wyczyścić obiekty, aby uniknąć wycieków pamięci.
To zachowanie łączy się ze zdarzeniem PreviewMouseWheel
, co daje mu możliwość przechwycenia zdarzenia, zanim ScrollViewer
będzie mógł je zobaczyć. Sprawdza pozycję, aby sprawdzić, czy musi przekazać zdarzenie w górę drzewa wizualnego do dowolnej wyższej hierarchii ScrollViewer
. Jeśli tak, ustawia wartość e.Handled
na true
aby zapobiec domyślnej akcji zdarzenia. Następnie wywołuje nowy MouseWheelEvent
kierowany do AssociatedObject
. W przeciwnym razie zdarzenie jest kierowane normalnie.
Dołączanie zachowania do elementu w XAML
Po pierwsze, interactivity
przestrzeń nazw xml musi zostać sprowadzona do zakresu, zanim będzie można jej użyć w XAML. Dodaj następujący wiersz do przestrzeni nazw swojej XAML.
xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "
Zachowanie można dołączyć w następujący sposób:
<ScrollViewer>
<!--...Content...-->
<ScrollViewer>
<interactivity:Interaction.Behaviors>
<behaviors:BubbleMouseWheelEvents />
</interactivity:Interaction.Behaviors>
<!--...Content...-->
</ScrollViewer>
<!--...Content...-->.
</ScrollViewer>
Spowoduje to utworzenie kolekcji Behaviors
jako właściwości Attached w wewnętrznej ScrollViewer
która zawiera zachowanie BubbleMouseWheelEvents
.
To szczególne zachowanie można również dołączyć do dowolnego istniejącego elementu sterującego, który zawiera osadzony ScrollViewer
, takiego jak GridView
, i nadal działałby poprawnie.