Archive | August, 2009

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

Ny dato til CNUG event "Udvikling med Microsoft Surface"

14 Aug

Da vores taler ikke har mulighed for at komme til Danmark onsdag den 19. august 2009, er vi nødsaget til at rykke arrangementet.

Vi arbejder på, at det bliver en dag indenfor den næste måneds tid. Den nye dato vil blive offentliggjort både her på LinkedIn og på CNUG.dk.

Arrangementet vil fortsat blive afholdt hos Microsoft i Hellerup.

Læs mere om arrangementet på CNUG.dk:
http://cnug.dk/udvikling-med-microsoft-surface-.aspx

Follow

Get every new post delivered to your Inbox.

Join 1,413 other followers