Wie bereits beim Blog-Eintrag zum Thema „Expression Blend 3 – Mehr Überblick behalten mit Behaviors“ wurde erklärt was „Behaviors“ sind und wofür sie gut sind. Dieser Artikel beschäftigt sich damit, wie Behaviors selbst geschrieben werden. Dabei wird als Beispiel ein Behavior für Silverlight geschrieben, um die neue Silverlight 3 „Mouse Wheel“ Funktion (Das Scrollen mit der Maus) für erwünschte Elemente ohne weiteres Programmieren einsetzen zu können.
Behavior selber schreiben – Die Grundlagen
Für ein Behavior wird lediglich die Basisklasse Behavior benötigt, die von der Assembly System.Windows.Interactivity.dll angeboten wird. Die Assembly wird vom Expression Blend 3 SDK zur Verfügung gestellt. Die Basisklasse bietet anschließend Methoden zum einklinken von Triggers und Commands. Diese werden mittels Override beansprucht.
public class BehaviorWithCommand : Behavior<DependencyObject>
{
public BehaviorWithCommand()
{
this.MyCommand = new ActionCommand(this.MyFunction);
}
protected override void OnAttached()
{
base.OnAttached();
}
protected override void OnDetaching()
{
base.OnDetaching();
}
public ICommand MyCommand
{
get;
private set;
}
private void MyFunction()
{
// Code to execute when your Command is called
}
}
Abb.1.1. – Ein Grundgerüst für ein Behavior
Abb.1.2. – Behaviors hängen sich zwischen die Prozesse
Das Mouse Wheel-Behavior
Das Mouse Wheel-Behavior ist sehr einfach aufgebaut. Hier wird der Mouse Wheel-Event vom erwünschten Usercontrol abonniert, das ab Silverlight 3 zur Verfügung steht (UIElement.MouseWheel). Über das vom Behavior vergebene Element wird über die Klasse AssociatedObject zugegriffen. Der Rest sorgt dafür, dass dann vom Usercontrol ein Scroll Vorgang stattfindet.
using System;
using System.Windows.Automation;
using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;
using System.Windows.Input;
using System.Windows.Interactivity;
using System.Windows.Controls;
namespace SilverlightBehavior
{
public class MouseWheelScrollBehavior : Behavior<Control>
{
private AutomationPeer Peer { get; set; }
protected override void OnAttached()
{
Peer = FrameworkElementAutomationPeer.FromElement(AssociatedObject);
if (Peer == null)
Peer = FrameworkElementAutomationPeer.CreatePeerForElement(AssociatedObject);
AssociatedObject.MouseWheel += AssociatedObject_MouseWheel;
base.OnAttached();
}
protected override void OnDetaching()
{
AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel;
base.OnDetaching();
}
private void AssociatedObject_MouseWheel( object sender, MouseWheelEventArgs e )
{
AssociatedObject.Focus();
int direction = Math.Sign(e.Delta);
ScrollAmount scrollAmount = (direction < 0) ? ScrollAmount.SmallIncrement : ScrollAmount.SmallDecrement;
if (Peer != null)
{
IScrollProvider scrollProvider = Peer.GetPattern(PatternInterface.Scroll) as IScrollProvider;
bool shiftKey = ( Keyboard.Modifiers & ModifierKeys.Shift ) == ModifierKeys.Shift;
if (scrollProvider != null && scrollProvider.VerticallyScrollable && !shiftKey)
scrollProvider.Scroll( ScrollAmount.NoAmount, scrollAmount );
else if (scrollProvider != null && scrollProvider.VerticallyScrollable && shiftKey)
scrollProvider.Scroll( scrollAmount, ScrollAmount.NoAmount );
}
}
}
}
Abb.2.1. – Das Mouse Wheel-Behavior
Damit nun in Expression Blend 3 das Behavior verwendet werden kann. Muss die Assembly mit dem selbst geschriebenen Behavior im Projekt Referenziert sein. Anschließend steht unter den „Assets“ – „Behaviors“ das neue Mouse Wheel-Behavior. Das kann dann über jedes Element von der Oberfläche vergeben werden, wobei natürlich nur Elemente mit möglichen Scroll-Balken vom wirklichen Interesse sind.
Abb.2.2. – Behavior auf einem Element aktivieren
Fazit
Normal hätte man erwartet das die Elemente unter Silverlight 3 von selbst verstehen, das bei einem drehen vom Maus rad gescrollt werden soll. Optimistisch gesehen, kann dafür die Mouse Wheel Funktion auch für andere Aspekte verwendet werden. Diese Freiheit ist schlussendlich auch nicht schlecht.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
