Expression Blend 3 – Das Silverlight 3 “Mouse Wheel-Behavior”

by Gregor Biswanger 13. Oktober 2009 06:22

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-haengen-sich-zwischen-die-Prozesse

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.–Behavio-auf-einem-Element-aktivieren

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.
kick it on dotnet-kicks.de

Kommentare

Powered by BlogEngine.NET 1.4.5.0
Theme by Extensive SEO

Über den Autor

Gregor Biswanger

Microsoft MVP für Client App Dev
XING

Gregor Biswanger (Microsoft MVP für Client App Dev) ist freier Consultant, Trainer, Autor und Speaker.


Seine Schwerpunkte liegen im Bereich der .NET-Architektur, agilen Prozessen und XAML. Er veröffentlichte vor kurzem seine DVD´s mit Video-Trainings zum Thema „Meine erste Windows 8 App“, „Windows Store Apps mit XAML und C#“ und „WPF 4.5 und Silverlight 5“ bei Addison-Wesley von video2brain.


Biswanger ist auch im Auftrag von Intel GmbH als Technologieberater für die Intel Developer Zone aktiv und ist Leader bei der Ingolstädter .NET Developers Group (INdotNET). 

 

Video über mich:
http://www.youtube.com/watch?v=mx_6SiiLxjk


Basta! 2011 Speaker

CLIPer

MCTS
Windows SharePoint Services 3.0 – Application Development (MCTS)