Kommunikation mellem Silverlight applikationer

18 Aug

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

%d bloggers like this: