A travers cette dernière partie, on retrouve le développement associée à l’application lourde WPF ou WinForm qui suit logiquement la partie développement JavaScript disponible à travers ces liens :

Bing Maps for Enterprise API WPF Winform integration Silverlight interoperabilite

Interaction de l’application lourde vers Silverlight

Afin d’agir sur l’application Silverlight depuis l’application lourde, on utilise les possibilité d’invoquer du script client à travers le contrôle WebBrowser utilisé.

Une des méthodes que nous ajoutons à la fenêtre principale de notre application a pour but d’ajouter du contenu en utilisant l’ensemble du processus décrit par les méthodes précédemment présentées.

Voici le code associé qui permets de déclencher la méthode addContent() :

private void btnAddContent_Click(object sender, RoutedEventArgs e)
{
    this.browser.InvokeScript("addContent", "45|3#");
}

On utilise directement le contrôle et la méthode InvokeScript() afin d’appeler la méthode JavaScript addContent() en lui passant les paramètres indiqués, cette méthode appellera par la suite la méthode du contrôle Silverlight.

Ainsi après avoir cliqué sur le bouton sur lequel est associé cet événement, on observe l’ajout de la punaise comme souhaité.

On vient alors de mettre en œuvre la communication depuis l’application lourde vers l’application Silverlight.

 

Interaction de l’application Silverlight et l’application lourde

L’ensemble des éléments qui seront exposés et accessible à travers le code JavaScript sont regroupés à travers un classe WindowExternalHelper dédiée à l’interopérabilité.

Cette classe propose un constructeur qui prend en paramètre la référence à la fenêtre principale de l’application lourde et qui initialise une variable de cette même classe afin d’interagir avec ce composant par la suite :

public WindowExternalHelper(MainWindow main)
{
    this.main = main;
} 

On ajoute également à cette classe, la méthode DisplayMessageBox() qui est appelée à travers le code JavaScript comme vu précédemment :

// Sample interop method
public void DisplayMessageBox(string message)
{
    this.main.ShowMessage(message);
}

Dans le code associé à l’événement OnLoad() de l’application lourde, on établit le code suivant qui s’occupe de référencer l’objet pour le code client tout en initialisant correctement cet objet :

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    // initialize the helper
    helper = new WindowExternalHelper(this);

    this.browser.ObjectForScripting = helper;
    this.browser.Navigate("http://localhost:48695/SLClientMapsSimpleTestPage.aspx");
}

On remarque l’utilisation de la propriété ObjectForScripting qui permet de spécifier une référence vers un objet que l’on souhaite rendre accessible à travers le code JavaScript.

Au final, lorsque l’utilisateur va cliquer sur la punaise ajouter suite au clic déclenchant la méthode addContent(), une fenêtre d’information de l’application lourde va s’ouvrir et afficher les informations issus du code client.

On vient ici de mettre en œuvre la communication depuis l’application Silverlight vers l’application lourde.

 

Limitations techniques

Cette technique employant un composant de type WebBrowser, on observe des limitations en termes d’intégration avec l’application lourde WPF.

Le rendu du contrôle WebBrowser n’est pas modifiable et le contenu de ce dernier s’affichera au dessus de tout quoi qu’il arrive. Les modifications de formes, les transformations et autres effets sur le contrôle ne seront pas appliqués au contenu ce qui peut être problématique.

 

Solution alternative pour l’intégration d’un browser en WPF

Une solution plus hétéroclite existe et consiste à utiliser le contrôle issu du projet Chromium afin d’obtenir un objet de type WebBrowser alternatif et qui supporte tout à fait les manipulations WPF mais également l’invocation de script.

 

Conclusions

Au final, on est dans un scénario d’intégration forte entre WPF et Silverlight où les données, événements, résultats ou appels quelconques peuvent être déclenchés de part et d’autres à condition que les possibilités souhaitées soient ajoutées dans ces scénarios d’interopérabilité.

L’intérêt d’une telle solution est de proposer un contrôle interactif, accéléré graphiquement et proposant l’ensemble des fonctionnalités du contrôle Silverlight directement au sein d’une application lourde qui pourrait être d’une toute autre nature.

Si vous avez des difficultés à comprendre une partie de cet article, n’hésitez pas à me laisser un commentaire ou contactez moi directement par message.

 

Exemples et code

Retrouvez l’exemple de mise en oeuvre directement à travers ce lien :

http://www.boonaert.net/documents/VE/BingMapsInterop.rar