Zoeken…
Invoering
Behavior
van de naamruimte System.Windows.Interactity
. Deze naamruimte maakt deel uit van de overkoepelende Expression Blend SDK, maar een lichtere versie, geschikt voor gedragsbibliotheken, is beschikbaar als een [nuget-pakket] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/
Eenvoudig gedrag om muiswielgebeurtenissen te onderscheppen
Het gedrag implementeren
Dit gedrag zorgt ervoor dat muiswielgebeurtenissen vanuit een interne ScrollViewer
naar de bovenliggende ScrollViewer
wanneer de binnenste de bovenste of onderste limiet heeft. Zonder dit gedrag zullen de gebeurtenissen nooit uit de inner 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);
}
}
}
Gedrag subklasse van de basisklasse Behavior<T>
, waarbij T
het type besturingselement is waaraan het kan koppelen, in dit geval UIElement
. Wanneer het Behavior
wordt geïnstantieerd vanuit XAML, wordt de methode OnAttached
aangeroepen. Met deze methode kan het gedrag worden gekoppeld aan gebeurtenissen van het besturingselement waaraan het is gekoppeld (via AssociatedControl
). Een vergelijkbare methode, OnDetached
wordt aangeroepen wanneer het gedrag moet worden losgemaakt van het bijbehorende element. Zorg ervoor dat u event-handlers verwijdert of op een andere manier objecten opruimt om geheugenlekken te voorkomen.
Dit gedrag PreviewMouseWheel
gebeurtenis PreviewMouseWheel
, waardoor deze de gebeurtenis kan onderscheppen voordat de ScrollViewer
kans krijgt deze te zien. Het controleert de positie om te zien of het de gebeurtenis omhoog door de visuele boom moet ScrollViewer
naar een hogere hiërarchie van ScrollViewer
. Als dit het geval is, wordt e.Handled
op true
om de standaardactie van de gebeurtenis te voorkomen. Vervolgens wordt een nieuwe MouseWheelEvent
gerouteerd die naar AssociatedObject
gerouteerd. Anders wordt de gebeurtenis normaal doorgestuurd.
Het gedrag koppelen aan een element in XAML
Eerst moet de interactivity
xml-namespace in scope worden gebracht voordat deze in XAML kan worden gebruikt. Voeg de volgende regel toe aan de naamruimten van uw XAML.
xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "
Het gedrag kan als volgt worden bevestigd:
<ScrollViewer>
<!--...Content...-->
<ScrollViewer>
<interactivity:Interaction.Behaviors>
<behaviors:BubbleMouseWheelEvents />
</interactivity:Interaction.Behaviors>
<!--...Content...-->
</ScrollViewer>
<!--...Content...-->.
</ScrollViewer>
Dit creëert een Behaviors
collectie als een bijgevoegde Property op de binnenste ScrollViewer
dat een bevat BubbleMouseWheelEvents
gedrag.
Dit specifieke gedrag kan ook worden gekoppeld aan elk bestaand besturingselement dat een ingesloten ScrollViewer
bevat, zoals een GridView
, en het zou nog steeds correct werken.