73 messaggi dal 19 ottobre 2005
Ciao,
Sto iniziando a sperimentare Silverligh 2 e mi chiedevo se fosse possibile fare in modo che l'applicazione non venga scaricata completamente all'avvio ma suddivisa in "pezzi" (magari per classi o assembly) scaricabili solo quando effettivamente necessari.
Grazie per l'attenzione, ciao!
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
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  .

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
73 messaggi dal 19 ottobre 2005
Grazie mille per la solerzia; per adesso la mia era solo una curiosità, appena inizierò a creare qualcosa di corposo utilizzerò il tuo consiglio.
Grazie ancora
Ciao
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
Prego prego
quando hai fatto qualcosa fai un fischio che sono curioso

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.