Astuce Silverlight : comment charger dynamiquement un contrôle depuis une DLL - #S027

image

Si vous avez une image ou une application lourde il peut être mieux de la couper et de la placer dans des plus petits composants (DLL) qui peuvent être téléchargés par le client depuis le serveur lorsqu’il en a besoin. De cette façon vos clients n’ont pas besoin d’attendre que toute l’application soit téléchargée à la première connexion à votre application sur le Web.

Dans cette astuce je vais vous montrer comment packager vos contrôles Silverlight dans une DLL et les placer sur votre serveur Web. Ensuite, je vais vous montrer comment faire que le client télécharge la DLL, créé et instancie le contrôle Silverlight depuis la DLL et ensuite ajouter le contrôle à votre application Silverlight.

Etape 1 : Créer un composant Silverlight dans une DLL

Pour commencer, créez une nouvelle Bibliothèque de Classes Silverlight. Cela peut être fait dans le menu de Visual Studio Fichier | Nouveau | Projet. Dans les types de projets étendez le nœud Visual C# et choisissez Silverlight. Depuis le panneau des modèles sur la droite de cette boite de dialogue choisissez Bibliothèque de Classes Silverlight. Entrez un nom de projet (ici « Mage ») et cliquez sur OK lorsque tout est prêt.

Faites un clic droit dans l’explorateur de solutions sur votre nœud Classe et choisissez Ajouter un nouvel élément. Cela affichera une boite de dialogue. Sélectionnez Contrôle Utilisateur Silverlight, donnez lui un nom (ici « Mage.xaml ») et cliquez sur OK.

Ajoutez le contenu que vous voulez à ce contrôle. Pour les besoins de cette démonstration j’ai simplement ajouté l’image d’un mage.

<UserControl x:Class="Mage.Mage"
   xmlns=https://schemas.microsoft.com/winfx/2006/xaml/presentation
   xmlns:x=https://schemas.microsoft.com/winfx/2006/xaml
   Width="96" Height="96">
    <Canvas>
        <Image Source="mage.png"></Image>
    </Canvas>
</UserControl>

Appuyez sur Ctrl+Maj.+B pour générer le projet. Cela ajoutera le composant dans une DLL située dans le répertoire bin : bin\Mage.dll.

Etape 2 : créer une application Silverlight

Maintenant que vous avez votre composant Silverlight généré et prêt à être lancé, il est temps de créer une application Silverlight qui va charger et afficher le composant. Créez une application Silverlight en sélectionnant dans le menu Fichier | Nouveau Projet et choisissez Application Silverlight. Donnez un nom de projet (ici MyGame) et cliquez sur OK.

Copiez la DLL du composant Silverlight que vous avez générée plus tôt (ici Mage.dll) dans le dossier de votre site Web.

Etape 3 : télécharger et afficher le contrôle Silverlight

Le code suivant montre comment charger et afficher le contrôle Silverlight. Quelques remarques :

  1. Ajouter la déclaration using pour référencer System.Reflection parce que nous avons créé un comporant déclaré en tant que objet Assembly.
  2. Utiliser le composant WebClient pour ouvrir la DLL en lecture asynchrone.
  3. Soyez sûr de pointer vers le chemin absolue de votre DLL. Un chemin absolu utilise l’URL compléte.
  4. Une fois que je téléchargement est complé, l’assembly est chargée et une instance du contrôle est créée.
  5. Enfin, le contrôle est ajouté au niveau racine de l’application.

Le résultat est une belle petite image de mage :

 image

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Documents;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Animation;
 using System.Windows.Shapes;
 using System.Reflection;
  
 namespace MyGame
 {
     public partial class Page : UserControl
     {
         private Assembly _mageComponent;
  
         public Page()
         {
             InitializeComponent();
  
             LoadMageComponent();
         }
  
         private void LoadMageComponent()
         {
             WebClient downloader = new WebClient();
             downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted);
  
             string component = "Mage.dll";
             string absoluteUri = System.Windows.Application.Current.Host.Source.AbsoluteUri;
             string path = absoluteUri.Substring(0, absoluteUri.IndexOf("ClientBin")) + component;
  
             downloader.OpenReadAsync(new Uri(path, UriKind.Absolute));
         }
  
         void downloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
         {
             AssemblyPart assemblyPart = new AssemblyPart();
             _mageComponent = assemblyPart.Load(e.Result);
             UserControl control = (UserControl)_mageComponent.CreateInstance("Mage.Mage");
             LayoutRoot.Children.Add(control);
         }
     }
 }

Syndication : Mike Snow’s Weblog
Traduction autorisée par Mike Snow.