Irgendwann kommt sie, die Anforderung nach dem Zugriff per JavaScript auf Typen/Methoden, die sich innerhalb einer Silverlight-Anwendung befinden. Dies ist recht einfach und ohne viel Aufwand zu ermöglichen:
Verwaltete Typen und Methoden bereit stellen
Sämtliche Typen und Methoden müssen mit Attributen gekennzeichnet werden, damit ein Zugriff per JavaScript möglich ist. Hierfür stehen zwei Attribute zur Verfügung:
- ScriptableTypeAttribute
- ScriptableMemberAttribute
Mit dem ScriptableTypeAttribute wird ein verwalteter Typ gekennzeichnet, dessen öffentliche Eigenschaften, Methoden und Ereignisse für JavaScript zur Verfügung stehen. Hier muss der Type jedoch durch HtmlPage.RegisterCreateableType registriert werden. Nachfolgend findet sich die Klasse Calculator, die mit besagtem Attribut versehen ist und somit vollständig via JavaScript verfügbar gemacht werden soll.
[ScriptableType]
public class Calculator
{
public int Add(int value1, int value2)
{
return value1 + value2;
}
}
Damit der Typ nun tatsächlich verfügbar ist, muss dieser Typ noch registriert werden:
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
HtmlPage.RegisterCreateableType("Calculator", typeof(Calculator));
}
}
Dabei beschreibt der erste Parameter den Typalias, über den dieser dann in weiterer Folge verwendet werden kann. Der zweite Parameter stellt die Typinformationen des zu registrierenden Typs bereit.
Das ScriptableMemberAttribute beschreibt, dass auf bestimmte Methoden, Eigenschaften oder Ereignisse per JavaScript zugegriffen werden kann. Eine so gekennzeichnete Methode stellt sich wie folgt dar:
[ScriptableMember]
public void CreateAlert(string value)
{
MessageBox.Show(value + " [via CreateAlert]");
}
Auch diese muss nun wieder registriert werden:
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
HtmlPage.RegisterScriptableObject("Alerting", this);
}
}
Analog zum obigen Beispiel wird auch hier ein Alias vergeben. D.h. der Zugriff kann via Alerting passieren. Mehr dazu weiter unten.
Dieses Attribut bietet zusätzlich noch zwei Eigenschaften an, die verwendet werden können, um die Veröffentlichung zu beeinflussen:
- EnableCreateableTypes: Per Standard werden automatisch Hilfsmethoden für den Zugriff generiert. Wird diese Eigenschaft auf false gestellt, passiert dies nicht und die Scriptwrapper müssen selbst erstellt werden (siehe auch RegisterCreateableType etc.)
- ScriptAlias: Beschreibt den Namen des Members, wie er für JavaScript verfügbar gemacht werden soll. Standardmäßig wird der im verwalteten Code vergebene Name herangezogen.
Hinweis: Zu beachten ist, dass Einstellungen über das ScriptableMemberAttribute das Verhalten des ScriptableTypeAttribute überschreibt.
Verwaltete Typen und Methoden verwenden
Die Verwendung ist nun auch nicht weiter schwierig. Gehen wir davon aus, dass eine Schaltfläche auf der Webseite existiert, der im onClick die JavaScript-Funktion OnClick aufruft, das Silverlight-Host-Objekt besitzt als Id den Wert sl:
function OnClick()
{
var slCtl = document.getElementById("sl");
var calculator = slCtl.Content.services.createObject('Calculator');
alert(calculator.Add(2,5));
}
Die erste Zeile bezieht nun das Hostobjekt. In der zweiten Zeile geschieht der Aufruf createObject, dem der Typalias übergeben wird. Der Rückgabewert stellt ein JavaScript-Objekt unseres registrierten Typen dar.
Hinweis: Für weitere Informationen und Einschränkungen möchte ich an dieser Stelle auf den Artikel Constructing Managed Types from JavaScript hinweisen.
Auf die via dem ScriptableMemberAttribute freigegebene Methode kann über den folgenden Aufruf zugegriffen werden:
slCtl.Content.Alerting.CreateAlert('From JavaScript');
Alerting beschreibt hier den registrierten Alias und CreateAlert selbst stellt die freigegebene Methode dar. Als Parameter wird ein Text übergeben, der dann auch in der Messagebox angezeigt wird:
Die vorgestellten Möglichkeiten sind ab Silverlight 3 verfügbar.
Fazit
Diese Features können im täglichen Leben mit Silverlight vieles ermöglichen. Dennoch sollte darauf geachtet werden, dass nicht grundsätzlich alles freigegeben wird, sondern lediglich die Teile, die tatsächlich öffentlich verfügbar sein müssen. Mögliche Szenarien sind beispielsweise das per JavaScript gesteuerte Nachladen/Refresh der in Silverlight angezeigten Daten, Navigationsunterstützung, Screenshot-Generierung usw.