Silverlight – Mit Drag and Drop in Bewegung

by Gregor Biswanger 4. Mai 2009 05:44

Mit Silverlight als Rich Interactive Application (RIA) sollen gerade die Unterschiede zwischen Desktop und Internet vereint werden. Demzufolge kommt des Öfteren der Wunsch bewegliche Controls, zum Beispiel als Windows-Fenster, umzusetzen. Solche Features machten unter anderem AJAX populär. Bei AJAX werden demnach leider die Technologien der Browser soweit ausgereizt, das es des Öfteren zu Browserabstützen führt. Ganz gleich ob es sich hierbei um einen Internet Explorer oder FireFox handelt. Zudem ist das beheben oder erweitern der fertigen AJAX-Controls sehr komplex.

Anders sieht es bei Silverlight-Applikationen aus. Bis auf das benötigte Plug-In, ist die Umsetzung und Realisierung beweglicher Elemente ein Kinderspiel. Ein recht oberflächliches Beispiel soll dies Demonstrieren.

Ein beweglicher TextBlock

Zu Beginn wird ein einfacher TextBlock durch eine Drag and Drop-Funktionalität erweitert. Wichtig dabei ist nur zu beachten, dass auf oberster Ebene ein Canvas-Element den Beweglichen Bereich zur Verfügung stellt.

Abb.1.1. – Einfaches TextBlock-Element in einem Canvas-Element.

Damit die TextBox auf die Maus reagieren kann, müssen auf die drei unterschiedlichen Events: MouseLeftButtonDown, MouseMove und MouseLeftButtonUp eine Logik hinterlegt werden.

Event

Logik

MouseLeftButtonDown

Aktuelle Position merken und Element an den Mauszeiger hängen.

MouseMove

Element an der aktuellen Mausposition zeichnen.

MouseLeftButtonUp

Element vom Mauszeiger entkoppeln.

Abb.1.2. – Die Logik der einzelnen Events.

Demzufolge werden dem TextBlock im XAML-Code diese drei Events definiert. Dabei hilft Visual Studio auch beim erzeugen der Methoden in der Code-Behind-Datei. Bei einer realen Umsetzung sollte dennoch der Source-Code ausgelagert werden, zum Beispiel behilft hierbei das Architektur-Pattern: Model-View-ViewModel (MVVM).

Abb.1.3. – TextBlock mit Events.

Die Events mit Logik ausrüsten

Bevor die Events ihre Ausrüstung erhalten, müssen zwei Variablen gewisse zustände festhalten. Zum einem eine Bool-Variable die vermerkt ob sich der Bewegte Mauszeiger in einem Drag and Drop-Modus befindet. Der Name für die Variable lautet IsDragging mit dem Standardwert false. Die zweite Variable soll sich die erste Position vor der Bewegung des Mauszeigers, mit dem Point-Objekt merken. Hierbei wird der Name auf BeginPointPosition festgelegt.

Abb.1.4. – Zwei interne Variablen um die Zustände festzuhalten.

Jetzt wird beim ersten Event MouseLeftButtonDown die dazugehörige Logik Programmiert. Zu Beginn muss erst unser Zustand im Drag and Drop Modus IsDragging auf true gesetzt werden. Danach bietet uns jedes XAML-Control das vom Interface UIElements ableitet eine Methode mit CaptureMouse() an. Die Methode erlaubt das Anhängen der Elemente an den Mauszeiger, womit ein späteres Festhalten vom Mauszeiger wahrgenommen wird. Am Ende wird aus dem MouseButtonEventArgs die aktuelle Position auf die Variable BeginPointPosition gemerkt. Der Source-Code dazu sieht folgendermaßen aus:

Abb.1.5. – Der Source-Code von MouseLeftButtonDown-Event.

Beim Programmieren der Logik von MouseMove-Event, muss jetzt nur der zustand auf Drag and Drop überprüft werden. Sonst wird bei jeder Mausbewegung über das Silverlight Element der Source-Code falsch ausgeführt. Anschließend wird die aktuelle Position mit der gemerkten Position abgezogen und das Element mittels SetValue auf das oberliegende Canvas-Element gesetzt. Auch hier der Source-Code dazu:

Abb.1.6. – Der Source-Code von MouseMove-Event.

Der letzte Event MouseLeftButtonUp ist zudem auch sehr einfach, hierbei muss nur der Zustand der Bool-Variable IsDragging wieder auf false gestellt werden. Dann wird vom Element mit der Methode ReleaseMouseCapture(), der Prozess vom Mauszeiger entkoppelt.

Abb.1.7. – Der Source-Code von MouseLeftButtonUp-Event.

Das war auch schon alles, um ein Element mittels Mausklick über die Oberfläche bewegen und abzusetzen.

Abb.1.8. – Drag and Drop von TextBlock.

Ein Silverlight-Window als Beispiel

Noch beliebter sind Windows ähnliche Fenster, die durch ein Grid-Element gezeichnet werden können. Ein Beispiel XAML-Code dafür wäre:

Abb.1.9. – Ein einfaches Windows-Fenster in XAML.

Das obere Schließen-Kreuz wird hierbei von einem TextBlock-Element mit einem normalen Buchstaben „X“ dargestellt. Das TextBlock-Element hat einen Event auf MouseLeftButtonDown und lässt das Window mit folgendem Code verschwinden: Window.Visibility = Visibility.Collapsed;

Wenn diese Funktionalität eingeführt wird, muss allerdings das Event vom Window mit MouseLeftButtonDown um eine IF-Abfrage mit if( Window.Visibility == Visibility.Visible ) erweitert werden, um einer Exception aus dem Weg zu gehen.

Abb.1.10. – Das Silverlight-Window.

Fazit

Mit Silverlight eigene Window-Elemente zu Coden macht um einiges mehr Spaß als fertige AJAX Funktionen in HTML zu definieren. Wenn es dann um Details geht, müssen umfangreiche JavaScript Kenntnisse vorhanden sein. Die Silverlight-Applikationen werden um einiges Attraktiver, zudem kann ein persönliches einrichten der Oberfläche für die Anwender zur Verfügung gestellt werden. Die Positionen können ja anschließend in den Anwendungsspeicher abgelegt werden.

Source-Code Download

SilverlightDragAndDropExample.zip (559,70 kb)

SilverlightWindow.zip (54,93 kb)



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)