2010-04-14 7 views
1

Je construis un iGoogle comme « tableau de bord » pour notre application avec silverlight 4.Dynamiquement ajouter des contrôles utilisateur à Silverlight 4 page

Chaque tableau de bord des utilisateurs (qui SNAPINS et leurs positions) seront stockées dans la base de données. Chaque composant logiciel enfichable est un contrôle utilisateur, par exemple ... AwesomeSnapin.xaml.

Sur la page de tableau de bord dans Silverlight, je récupère le tableau de bord des utilisateurs qui est une collection d'objets snapin qui incluent les informations sur le snapin. Je peux stocker le nom de la page ou de la classe ou tout ce qui est nécessaire.

J'ai le code suivant qui parcourt la collection de snapins pour les ajouter à la page de tableau de bord. Lors des tests, j'ai juste codé un seul élément snapin. Voici le code prototype:

 foreach (var UserSnapin in op.Entities) 
     { 
      UserControl uc = new AmsiSL.eFinancials.BudgetCheck(); 

      Canvas.SetLeft(uc, UserSnapin.PositionLeft); 
      Canvas.SetTop(uc, UserSnapin.PositionTop); 

      Layout.Children.Add(uc); 

      MessageBox.Show(String.Format("Added {0}",UserSnapin.Snapin.Name)); 
     } 

Les travaux ci-dessus bien ... mais bien sûr, ajoute le snapin BudgetCheck pour chaque élément qui est défini pour le tableau de bord des utilisateurs. Bien sûr, la boîte de message est à des fins de débogage uniquement. Comment changer la ligne 3 pour charger la classe de contrôle utilisateur (en utilisant le nom de classe ou le chemin xaml, selon ce qui est le meilleur) en fonction des données de la collection.

Répondre

3

Je suppose pour l'instant que UserSnapin.Snapin.Name dans ce cas est "BudgetCheck" et que tous les Snapins se trouvent dans l'espace de noms AmsiSL.eFinancials. Je suppose également que vos commandes Usercontrols sont compilées dans le même assemblage d'application. Vous pouvez utiliser ce code: -

foreach (var UserSnapin in op.Entities) 
    { 
     Type snapInType = Assembly.GetExecutingAssembly() 
      .GetType("AmsiSL.eFinancials." + UserSnapin.Snapin.Name); 

     UIElement snapIn = (UIElement)Activator.CreateInstance(snapInType); 

     Canvas.SetLeft(snapIn , UserSnapin.PositionLeft); 
     Canvas.SetTop(snapIn , UserSnapin.PositionTop); 

     Layout.Children.Add(snapIn); 
    } 

Si les snapins sont une bibliothèque à la place, vous pouvez probablement utiliser la méthode statique Type.GetType(string) pour résoudre la valeur snapInType mais vous devez connaître le nom de montage ainsi.

+0

Merci Je vais essayer dès que mon projet sera lancé dans la RTM. Je n'étais pas sûr si la réflexion était la meilleure méthode ou le chargement du XAML. – PilotBob

+0

Fonctionne très bien. Merci pour cela. – PilotBob

Questions connexes