I Silverlight 2 er det muligt at flere Silverlight applikationer, indenfor et website, snakke sammen. Måden det gøres på er ved hjælp af lidt javascript på vores HTML host.
1: <script type="text/javascript">
2: function CallUpdate(msg) {
3: silverlightControl = document.getElementById("sl2");
4: silverlightControl.Content.MainPage.UpdateTextBlock(msg);
5: }
6: </script>
I javascript funktionen tager vi fat i den Silverlight applikation der skal modtage en besked og kalder en registreret metode i applikationen.
I vores Silverlight applikation der afsender beskeden, skal vi kalde vores javascript funktion med den besked vi vil afsende – det gøres via HtmlPage.Window.Invoke.
1: private void Button_Click(object sender, RoutedEventArgs e)
2: {
3: string message = m_Message.Text;
4: HtmlPage.Window.Invoke("CallUpdate", message);
5: }
Den metode i vores Silverlight applikationen der skal modtage et input, skal have attributten [ScriptableMember] tilføjet. I Application_Startup skal en instans af den XAML fil, der indeholder vores metode, registeres i som en metode vi kan kalde via vores javascript funktion.
1: [ScriptableMember]
2: public void UpdateTextBlock(string msg)
3: {
4: m_TextBlock.Text = msg;
5: }
1: private void Application_Startup(object sender, StartupEventArgs e)
2: {
3: MainPage m = new MainPage();
4: HtmlPage.RegisterScriptableObject("MainPage", m);
5: this.RootVisual = m;
6: }
Alt i alt ganske simpelt, men der skal skrives uforholdsvis meget kode og det er nødvendigt at anvende hosten aktivt som bindeled.
Kildekoden til Silverlight 2 eksemplet ligger her.
I Silverlight 3 er det gjort markant nemmere. Vi behøver ikke længere anvende javascript og kaldet mellem applikationerne kører asynkront. I Silverlight hedder det LocalConnections.
I vores applikation der afsender beskeden anvender vi LocalMessageSender – den kan afsende vores besked asynkront.
1: private void Button_Click(object sender, RoutedEventArgs e)
2: {
3: string message = m_Message.Text;
4: LocalMessageSender msgSender = new LocalMessageSender("myReceiver");
5: msgSender.SendAsync(message);
6: }
I vores load event på den side i vores Silverlight applikation, der skal modtage besked, tilføjer vi en LocalMessageReceiver, der asynkront står og lytter på at modtage beskeder.
1: void MainPage_Loaded(object sender, RoutedEventArgs e)
2: {
3: LocalMessageReceiver receiver = new LocalMessageReceiver("myReceiver");
4: receiver.MessageReceived += (se, ea) =>
5: {
6: ea.Response = "Thanks for the message!";
7: Dispatcher.BeginInvoke(() =>
8: {
9: m_TextBlock.Text = ea.Message;
10: });
11: };
12: // Asynchronous listening - not blocking anything here
13: receiver.Listen();
14: }
Mere skal der ikke til for at få det til at fungere i Silverlight 3. Det fede er endvidere, at vi har mulighed for, at lade vores afsender modtage en besked om, at modtageren har modtaget besked og eventuelt en fejlbesked.
1: EventHandler<SendCompletedEventArgs> handler = null;
2: handler =
3: (se, ea) =>
4: {
5: Dispatcher.BeginInvoke(() =>
6: {
7: msgSender.SendCompleted -= handler;
8:
9: if (ea.Error != null)
10: {
11: m_TextBlock.Text = String.Format("Error: {0}",
12: ea.Error.Message);
13: }
14: else
15: {
16: m_TextBlock.Text = String.Format("{0}",
17: ea.Response == null ? "None" : ea.Response);
18: }
19: });
20: };
21: msgSender.SendCompleted += handler;
Kildekoden til Silverlight 3 eksemplet ligger her.
Er man til Javascript er det fortsat er muligt at anvende Silverlight 2 metoden i Silverlight 3.
Happy Coding!
Thomas Castøe Martinsen