2010-09-03 5 views
2

J'essaie de construire une bibliothèque de contrôles Silverlight où le client peut choisir le contrôle qu'ils veulent utiliser. Le projet Silverlight Application aura plusieurs contrôles utilisateur. La structure est quelque chose comme:Comment référencer un contrôle utilisateur Silverlight?

Project 
-App.xaml 
-MainPage.xaml 
--Controls (Folder) 
------ControlA.xaml 
------ContorlB.xaml 

Comment puis-je référencer ControlA ou ControlB à partir de mes pages HTML? Il semble qu'il soit seulement possible de faire référence aux assemblages xap, ai-je donc besoin de créer une application Silverlight pour chaque commande usercontrol? On dirait que c'est trop?

Si je voulais utiliser ControlA de la bibliothèque, donc je veux être en mesure de faire quelque chose comme:

<object> 
    <param name="source" value="ClientBin/Silverlight.xap"/> 
    <param name="class" value="ControlA"/> 
</object> 

Je sais que ce qui précède n'est pas valide le balisage SL, mais je pense que vous pouvez comprendre ce que je suis essayer de faire?

+0

Ne comme l'accès à la classe que vous signifie « référence », ou dans l'accès aux instances de la classe? – SirDemon

+0

Accès à la classe – GMan

Répondre

1

Vous pouvez avoir un fichier XAML de contrôleur qui lit les InitParams.

passer la valeur en HTML pour Silverlight:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
     <param name="source" value="ClientBin/SilverlightApplication1.xap"/> 
     <param name="onError" value="onSilverlightError" /> 
     <param name="initparams" value="control=ControlA" /> 
     ... 

Et dans votre événement Application_Startup lire votre valeur:

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    var initParams = e.InitParams; 

    if (initParams.Keys.Contains("control")) 
    { 
     if (initParams["control"] == "ControlA") 
     { 
      // Render control A 
      // this.RootVisual = new ControlA(); 
     } else if (initParams["control"] == "ControlB") 
     { 
      // Render control B 
      // this.RootVisual = new ControlB(); 
     } 
    } 

    // Default page.  
    this.RootVisual = new MainPage(); 
} 
+1

L'utilisation de initparams est bonne, mais une série de 'else if 'serait lourde pour de nombreux contrôles. Voir cette réponse pour une solution plus dynamique: http://stackoverflow.com/questions/2338016/silverlight-how-to-create-a-page-dynamically/2338131#2338131 – AnthonyWJones

1

Vos contrôles Silverlight ne sont pas exposés au code HTML. L'application Silverlight elle-même est simplement un <object> en balisage HTML (histoire simplifiée, bien sûr); les contrôles sont uniquement disponibles dans l'application Silverlight.

Il existe des moyens de communiquer entre votre application Silverlight et le balisage Web, par ex. vous pourriez trouver un moyen de changer l'application Silverlight qui contrôle son rendu.

+0

Je sais, mais comment puis-je spécifier quel xaml je veux rendre en utilisant la balise . On dirait que je peux seulement pointer vers le fichier xap et non les contrôles à l'intérieur. – GMan

+0

Probablement le moyen le plus simple consiste à utiliser le paramètre InitParams (http://msdn.microsoft.com/en-us/library/cc838255%28VS.95%29.aspx) sur la balise . Alternativement, pour une utilisation plus interactive, vous pouvez utiliser le pont HTML (http://msdn.microsoft.com/en-us/library/cc645076%28VS.95%29.aspx) pour interagir entre votre page de marquage et votre application Silverlight. via Javascript. De toute façon, vous devrez avoir votre application Silverlight assez intelligente pour gérer les entrées et réagir de manière appropriée. – Jimmy

Questions connexes