Oggi sono finalmente riuscito a venire a capo di un problema che da tempo mi affliggeva. Nella mia applicazione Silverlight, apparentemente in modo causale la barra di controllo laterale di tanto in tanto si spostava nel bel mezzo della pagina... nulla di così grave, bastava fare il resize della finestra e tutto tornava a posto, ma ovviamente il comportamento è del tutto inaccettabile. Oggi finalmente ho avuto il tempo di capire l'origine del malfunzionamento che si è rivelato originato da un probabile bug imputabile a Silverlight.

L'origine del problema è la seguente: Quando avete un host, posizionato sulla pagina al 100% in modo da riempire in modo dinamico un'area della pagina (o tutta), pare che l'apertura di un nuovo tab di Internet Explorer 7.0 metta un po' in crisi il plugin. Quello che avviene pochi istanti dopo essere passati al nuovo tab è che l'host solleva due eventi OnResize. Il primo è corretto anche se non necessario, ma il secondo (immediatamente consecutivo) invece arriva portando con se delle misure fasulle dell'host pari circa al 50% della misura reale.

L'unico modo che ho trovato di gestire questo errore è di confrontare le misure che mi arrivano con una misura certa all'interno della pagina che mi confermi che il dato non è errato. Per farlo è praticamente obbligatorio usare la MicrosoftAjax Library:

   1: handleResize : function(sender, eventArgs)
   2: {
   3:     var bounds = Sys.UI.DomElement.getBounds($get('silverlightPlugInHost'));
   4:     
   5:     if (bounds.width != this.plugIn.content.actualWidth && 
   6:         bounds.height != this.plugIn.content.actualHeight)
   7:         return;
   8:     
   9:     // Do what you want with actualWidth & actualHeight
  10: }

L'obbligo nell'uso della MS Ajax Library deriva dal fatto che implementare in proprio la getBounds() in modo cross-browser è tutt'altro che una passeggiata. Quello che faccio in sostanza è di verificare le dimensioni date da actualWidth e actualHeight per mezzo del DIV che contiene l'host. Naturalmente questo dovrà avere le stesse dimensioni dell'host altrimenti non vale...

Qualcuno potrebbe dire che a questo punto varrebbe la pena di usare direttamente le dimensioni di DIV, ma considerate che io l'applicazione l'ho già fatta e così devo modificare il minimo indispensabile. E poi preferisco usare il metodo normale e gestire i casi eccezionali diversamente.


Commenti (1) -

# | Marco Trova | 06.03.2008 - 05.57

Conosco un bug-hunter.. :-P

Aggiungi Commento

della mia vita e di altre amenità

Uno scambio con Mauro Sagratella mi ha ricordato una piccola questione riguardante IMHO che da tempo avevo dimenticato. Chi avesse un palmare e provasse ad usare ActiveSync mentre IMHO è in esecuzione avrà la spiacevole sorpresa che l'ActiveSync non funzionerà. Oppure tentando di aprire IMHO mentre è in corso una sincronizzazione sarà IMHO a non riuscire a partire. Il problema è di semplice spiegazione e per fortuna anche di semplice soluzione. IMHO fa uso di una porta, la 3010, sulla quale si mette in ascolto di chiamate di remoting da parte dell'handler che gestisce il quoting da Internet Explorer o Firefox. A quanto pare tale porta è utilizzata anche da ActiveSync per cui dato che non è possibile che due socket condividano la stessa porta il secondo che arriva non riuscirà a partire. Come dicevo, la soluzione è semplice: è sufficiente andare nei file imho.exe.config e imhoie.exe.config e cambiare il numero della porta che deve coincidere nei due file. Ad esempio Mauro mi segnala che la 2710 funziona egregiamente.

Detto questo c'è una curiosità relativa le porte prescelte che vi giro come un indovinello. Riuscite ad indovinare per quale motivo ho scelto di usare la porta 3010? Chi mi segue non dovrebbe aver difficoltà a rispondere alla domanda.

Mauro che lo sa è invitato ad astenersi...

powered by IMHO 1.3

tags: - categories:

Commenti (3) -

# | Michele Bernardi | 09.11.2005 - 20.53

Papa-Boschin! :-D
...O mamma cosa ho scritto, volevo dire:
Papà-Boschin!!!

# | Andrea Boschin | 09.11.2005 - 20.56

LOL

# | Jazzer | 10.11.2005 - 00.38

Ma che era successo, ti si era ammosciato il blog? Volevo commentare prima ma non era possibile.
Anch'io ero per papa-Boschin!

Aggiungi Commento