Erweiterte Programmierung


Ein weiteres Konzept der WPF sind sogenannte "Routingereignisse". Auf Routing-Ereignisse reagiert man mit sogenannten "Ereignishandlern". Ereignishandler funktionieren jedoch nur im Zusammenhang mit Code-Behind-Dateien in Visual-Studio, da XAML gemeinsam mit der Code-Behind-Datei kompiliert wird. In iPlus werden XAML-Designs zur Laufzeit geladen. Die Verbindung zu einem Businessobjekt bzw. ACComponent erfolgt daher nur per Datacontext, der automatisch bei den VBVisual und VBDesign-Steuerlementen vom iPlus-Framework gesetzt wird. Ereignishandler müssen daher in der ACComponent als normale clientseitige Methoden mit der ACMethodInteractionClient-Attributklasse bereitgestellt werden:

 

Alternativ können Sie auch clientseitige Skriptmethoden in der iPlus-Entwicklungsumgebung definieren.

Wichtig: Falls Sie die Methode in einem Businessobjekt deklarieren, können Sie normale Methoden mit der Attributklasse "ACMethodInfo" als Ereignishandler-Methoden verwenden. Dies ist möglich, weil ein Businessobjekt nie als Proxyobjekt vorliegen kann im Vergleich zu Instanzen aus den Anwendungsprojekten. Bei diesen Methoden entfällt auch der zwingende, erste Parameter, bei dem die IACComponent-Referenz übergeben wird.

Nachdem Sie die Methode definiert haben öffnen Sie im Designer das Werkzeugfenster und das Eigenschaftsfenster. Schalten Sie im Eigenschaftsfenster auf die Events-Liste um indem Sie auf die Taste "Events" drücken (1):

 

Erweitern Sie den Methodenbereich im Werkzeugfenster und ziehen per "Drag & Drop" ihre Ereignishandlermethode auf das Ereignis, auf das Sie mit dieser Methode reagieren möchten (2). Im Beispiel wird auf das MouseLeftButtonUp-Ereignis reagiert. Wenn Sie zusätzlich die CheckBox "OnlyOnDblClick" anwählen, wird nur bei Doppelklick Ihre Methode aufgerufen.

Wechseln Sie anschließend in den XAML-Editor. Es wurde folgender Code generiert:

 

Dem Ereignis wurde ein Ereignishandler mit dem Namen VBDelegateExtension zugewiesen. VBDelegateExtension ist eine Markuperweiterung aus der gip.core.layoutengine. VBDelegateExtension hat die Fähigkeit ACUrlCommand-Aufrufe durchzuführen und somit die oben beschriebene clientseitige Methode aufzurufen. Im Beispiel wurde die Eigenschaft ACUrlCmd nur mit vorangestelltem Ausrufezeichen und dem Methodennamen gesetzt. Dies ist ein relativer Aufruf zu der gebundenen ACComponent (DataContext). Der Aufruf kann natürlich auch absolut angegeben werden.

Das Setzen der OnlyOnDblClick-Eigenschaft im Eigenschaftsfenster wirkt sich im XAML-Code folgendermaßen aus:

 


Beim Reagieren auf Ereignisse ist es manchmal notwendig mehr darüber zu erfahren von wem das Ereignis ausgelöst worden ist. Dafür stellt die WPF die Basisklasse "RoutedEventArgs" zur Verfügung, die beim Tunneling und Bubbling weitergeleitet werden.

Um RoutedEventArgs von der VBDelegateExtension übergeben zu bekommen, erweitern Sie Ihre Ereignisbehandlungsmethode um einen Parameter. Im folgenden Beispiel besitzt die Methode den Parameter "MouseEventArgs e"_

 

Weil die Methode ist in einem Businessobjekt deklariert ist, entfällt der erste Parameter IACComponent. Bei clientseitigen Methoden würde die Signatur zwei Parameter haben:

public void MyMethodName(IACComponent acComponent, MouseEventArgs e)

Damit der RoutedEventArgs-Parameter von der VBDelegateExtension beim Ausführen von ACUrlCommand übergeben wird, klicken Sie im Eigenschaftsfenster des Designers die Checkbox "PassEventArgs" an. Im XAML-Code äußert sich dies folgendermaßen:

 


Auf Ereignisse können Sie auch in Styles per EventTrigger reagieren. Mit EventTriggern kann jedoch keine Methode im Modell (bzw. ACComponent) aufgerufen werden, sondern sie kann, wie Eigenschafts-Trigger auch, nur zur Dynamisierung der Oberfläche verwendet werden. Primär wird Sie für Animationen benötigt, auf die im nachfolgenden Kapitel eingegangen wird.