Suche…
Einführung
Behavior
Klasse des System.Windows.Interactity
Namespace. Dieser Namespace ist Teil des übergeordneten Expression Blend SDK, eine leichtere Version, die für Verhaltensbibliotheken geeignet ist, ist als [Nuget-Paket] [1] verfügbar. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/
Einfaches Verhalten zum Abfangen von Mausradereignissen
Verhalten implementieren
Dieses Verhalten führt dazu, dass Mausrad-Ereignisse von einem inneren ScrollViewer
zum übergeordneten ScrollViewer
wenn sich der innere an der oberen oder unteren Grenze befindet. Ohne dieses Verhalten werden die Ereignisse den inneren ScrollViewer
niemals 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);
}
}
}
Behaviours subclass die Behavior<T>
UIElement
, wobei T
der Typ des Steuerelements ist, mit dem es verbunden werden kann, in diesem Fall UIElement
. Wenn das Behavior
aus XAML instanziiert wird, wird die OnAttached
Methode aufgerufen. Diese Methode ermöglicht es dem Verhalten, sich über Ereignisse (über AssociatedControl
) an Ereignisse AssociatedControl
. Eine ähnliche Methode, OnDetached
wird aufgerufen, wenn das Verhalten von dem zugeordneten Element getrennt werden muss. Eventuelle Handler sollten entfernt oder auf andere Weise Objekte entfernt werden, um Speicherlecks zu vermeiden.
Dieses Verhalten hängt mit dem PreviewMouseWheel
Ereignis zusammen. Dadurch kann das Ereignis abgefangen werden, bevor der ScrollViewer
die ScrollViewer
hat, es zu sehen. Er prüft die Position, um zu sehen, ob das Ereignis in der visuellen ScrollViewer
höhere Hierarchie von ScrollViewer
werden muss. Wenn ja, wird e.Handled
auf true
, um die Standardaktion des Ereignisses zu verhindern. Anschließend wird ein neues MouseWheelEvent
an AssociatedObject
. Andernfalls wird das Ereignis normal weitergeleitet.
Anhängen des Verhaltens an ein Element in XAML
Zunächst muss der XML-Namespace für die interactivity
in den Gültigkeitsbereich aufgenommen werden, bevor er in XAML verwendet werden kann. Fügen Sie den Namespaces Ihrer XAML die folgende Zeile hinzu.
xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interaktivität "
Das Verhalten kann wie folgt angehängt werden:
<ScrollViewer>
<!--...Content...-->
<ScrollViewer>
<interactivity:Interaction.Behaviors>
<behaviors:BubbleMouseWheelEvents />
</interactivity:Interaction.Behaviors>
<!--...Content...-->
</ScrollViewer>
<!--...Content...-->.
</ScrollViewer>
Dadurch wird eine Behaviors
als ScrollViewer
Eigenschaft im inneren ScrollViewer
, die ein BubbleMouseWheelEvents
Verhalten enthält.
Dieses Verhalten kann auch an ein vorhandenes Steuerelement angehängt werden, das einen eingebetteten ScrollViewer
enthält, z. B. eine GridView
, und es funktioniert weiterhin ordnungsgemäß.