Cet article suit la présentation technique disponible à travers ce lien.

Le développement Silverlight se résume à un scénario simple ici, on souhaite pouvoir ajouter des points provenant à des informations issues du code C# de l’application lourde.

Bing Maps for Enterprise API Silverlight interoperabilite

Pour prouver la bi-directivité de cette intégration, on prévoit également le scénario inverse et l’utilisateur pourra transporter les coordonnées du point cliqué en sélectionnant une punaise, vers l’application WPF ou Winform.

 

Dans le cadre de la démonstration de l’interopérabilité WPF/Winform vers Silverlight, on commence par enregistrer le contrôle et ajouter des attributs sur des méthodes identifiées.

Enregistrement du contrôle

Tout d’abord, au niveau de Silverlight, il faut enregistrer le composant applicatif Silverlight comme un “Scriptable Object” autrement dit, objet qui exposera des membres accessibles à travers le script client.

Pour réaliser cela, il suffit d’inscrire cette instruction dans un des événements adaptés (ici l’événement Loaded du Map Control) :

void map_Loaded(object sender, RoutedEventArgs e)
{
    // Register scriptable component 
    HtmlPage.RegisterScriptableObject("mySLapp", this);
}

Dans cette configuration, mon objet sera accessible dans le code client en utilisant le nom “mySLapp” au sein du JavaScript.

 

Définition des membres accessibles au sein du JavaScript

Dans ce scénario d’exemple, on souhaite proposer l’appel à deux méthodes Silverlight à travers le code JavaScript.

Une première méthode est donc créée, elle permets très simplement de changer le style de la carte sur le contrôle en cours :

[ScriptableMemberAttribute]
public void SetMapStyle(string style)
{
    switch (style)
    {
        case "road":
            this.map.Mode = new RoadMode();
            break;
        case "hybrid":
            this.map.Mode = new AerialMode(true);
            break;
        default:
            this.map.Mode = new AerialMode(false);
            break;
    }
}

On remarque dès lors, l’utilisation de l’attribut ScriptableMemberAttribute apposé sur la méthode, c’est ce dernier qui va déterminer le fait que cette méthode soit accessible.

On réalise la même opération pour une seconde méthode qui aura pour but d’ajouter du contenu sur le contrôle Bing Maps :

[ScriptableMemberAttribute]
public void AddContent(string encodedContent)
{
    var pins = encodedContent.Split('#');
    foreach (var curPinData in pins)
    {
        if (curPinData != string.Empty)
        {
            var pinData = curPinData.Split('|');
            if (pinData != null)
            {
                Pushpin currentPin = null;
                if (pinData.Any())
                {
                    currentPin = new Pushpin()
                    {
                        Location = new Location(
                            double.Parse(pinData[0]),
                            double.Parse(pinData[1])
                        )
                    };
                }

                if (currentPin != null)
                {
                    currentPin.MouseLeftButtonUp += 
                        new MouseButtonEventHandler(currentPin_MouseLeftButtonUp);
                    this.map.Children.Add(currentPin);
                }
            }
        }
    }
}

Ces deux méthodes pourront ainsi être appelées depuis le code client JavaScript qui sert très clairement d’interface entre le code C# (clientside) de l’application Silverlight, au code C# de l’application lourde qui héberge le WebBrowser.

 

Interaction Silverlight vers application lourde WPF/WinForm

Au sein de la méthode de création de la punaise précédemment présentée, on remarque l’association de l’événement sur le bouton de la souris :

currentPin.MouseLeftButtonUp += 
    new MouseButtonEventHandler(currentPin_MouseLeftButtonUp);

Voici le code associé qui permets d’interagir avec l’application lourde en invoquant tout simplement le code client (JavaScript) présent sur la page :

void currentPin_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    Location pinLocation = ((Pushpin)sender).Location;
    string message = 
        string.Format("Lat={0};Lng={1}", 
                        pinLocation.Latitude, 
                        pinLocation.Longitude);

    HtmlPage.Window.Invoke("wpfDisplayMessage", message);
}

La méthode Invoke() de la classe HtmlWindow propriété de l’objet HtmlPage de l’application Silverlight permet de déclencher du code JavaScript depuis l’application Silverlight.

Ici nous déclenchons la méthode JavaScript nommée wpfDisplayMessage() en lui passant en paramètre le message à afficher sous forme de chaîne de caractère. Nous verrons ci-dessous le contenu de la méthode JavaScript ici déclenchée.

Nous verrons la suite concernant le développement JavaScript.