Ciao,
sì, è possibile; puoi dividere la tua applicazione in più parti che siano applicazioni o librerie di classi e caricarle utilizzando la classe WebClient:
WebClient webClient = new WebClient();
webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(WebClient_OpenReadCompleted);
webClient.OpenReadAsync(new Uri("NewApp.xap", UriKind.Relative));
Ovviamente il caricamento è asincrono per non bloccare il resto dell'interfaccia, una volta completato è necessario utilizzare un po' di reflection per creare l'istanza della Page contenuta nel file XAP e creare in memoria l'opportuna gerarchia di assembly referenziati, io lo faccio così:
void WebClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
string appManifest = new StreamReader(Application.GetResourceStream(new StreamResourceInfo(e.Result, null), new Uri("AppManifest.xaml", UriKind.Relative)).Stream).ReadToEnd();
Deployment deploy = XamlReader.Load(appManifest) as Deployment;
Assembly asm = null;
foreach (AssemblyPart asmPart in deploy.Parts)
{
string source = asmPart.Source;
StreamResourceInfo streamInfo = Application.GetResourceStream(new StreamResourceInfo(e.Result, "application/binary"), new Uri(source, UriKind.Relative));
if (source == "NewApp.dll")
{
asm = asmPart.Load(streamInfo.Stream);
}
else
{
asmPart.Load(streamInfo.Stream);
}
}
IPage newSection = asm.CreateInstance("NewApp.Page") as IPage;
if (newSection != null)
{
newSection.LoadData();
}
placeHolder.Children.Clear();
placeHolder.Children.Add((UIElement)newSection);
placeHolder.UpdateLayout();
}
Con il metodo CreateInstance si va proprio a creare l'istanza della Page del nuovo progetto, nell'esempio io uso un interfaccia perchè ho bisogno di chiamare subito dopo un suo metodo (LoadData), che non avrei potuto chiamare in quanto CreateIstance restituisce un Object, subito dopo è possibile posizionarlo nell'applicazione principale aggiungendolo alla collezione di controlli di un "segnaposto" che hai precedentemente piazzato nella pagina, nel metodo Add ho dovuto fare il cast a UIElement perchè i controlli Silverlight non conoscono la mia interfaccia IPage
.
E' un po' macchinoso ma è indispensabile perchè altrimenti obblighi l'utente a scaricarsi in un istante un mattone di XAP che magari non vedrà neanche
.