Sök…
Introduktion
Behavior
i System.Windows.Interactity
namnområdet. Detta namnutrymme är en del av det övergripande Expression Blend SDK, men en lättare version, lämplig för beteendebibliotek, finns som ett [nuget-paket] [1]. [1]: https://www.nuget.org/packages/System.Windows.Interactivity.WPF/
Enkelt beteende för att fånga händelser med mushjul
Implementera beteendet
Detta beteende kommer att göra att mushjulshändelser från en inre ScrollViewer
upp till överordnade ScrollViewer
när den inre är antingen vid den övre eller nedre gränsen. Utan detta beteende kommer händelserna aldrig att komma ut ur den inre 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);
}
}
}
Beteenden underklasserar Behavior<T>
basklassen, där T
är den typ av kontroll som den kan koppla till, i detta fall UIElement
. När Behavior
inställs från XAML OnAttached
metoden. Denna metod tillåter beteendet att ansluta till händelser från kontrollen det är kopplat till (via AssociatedControl
). En liknande metod, OnDetached
kallas när beteendet måste hakad från det tillhörande elementet. Se till att ta bort eventuella hanterare av händelser eller på annat sätt rensa upp föremål för att undvika minnesläckor.
Detta beteende PreviewMouseWheel
händelsen PreviewMouseWheel
, vilket ger det en förändring att fånga upp händelsen innan ScrollViewer
har en chans att se den. Den kontrollerar positionen för att se om den behöver vidarebefordra händelsen upp det visuella trädet till någon ScrollViewer
högre hierarki. Om så är e.Handled
ställer den e.Handled
på true
att förhindra händelsens standardåtgärd. Den höjer sedan en ny MouseWheelEvent
dirigeras till AssociatedObject
. Annars dirigeras händelsen som normalt.
Fästa beteendet till ett element i XAML
Först måste interactivity
xml-namnutrymmet bringas till omfattning innan det kan användas i XAML. Lägg till följande rad i namnytorna på din XAML.
xmlns: interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "
Beteendet kan kopplas på så sätt:
<ScrollViewer>
<!--...Content...-->
<ScrollViewer>
<interactivity:Interaction.Behaviors>
<behaviors:BubbleMouseWheelEvents />
</interactivity:Interaction.Behaviors>
<!--...Content...-->
</ScrollViewer>
<!--...Content...-->.
</ScrollViewer>
Detta skapar en Behaviors
samling som en bifogad egenskap i den inre ScrollViewer
som innehåller ett BubbleMouseWheelEvents
beteende.
Detta specifika beteende kan också knytas till alla befintliga kontroller som innehåller en inbäddad ScrollViewer
, till exempel en GridView
, och det skulle fortfarande fungera korrekt.