Sto lavorando su un applicazione Silverlight che, tra le varie funzionalità, deve eseguire il play di streams in formato .wma e per questo requisito la scelta cade automaticamente sulla classe MediaElement. Convinto della banalità della cosa ho scritto qualcosa tipo:

MediaElement me = new MediaElement();
me.Source = new Uri("http://thesite.com/stream.wma", UriKind.Absolute);
me.Play();

per scoprire che non funziona, ho quindi rimediato usando:

WebClient wc = new WebClient();
wc.OpenReadCompleted += (s, arg) =>
{
   me.SetSource(arg.Result);
   me.Play();
};
 
wc.OpenReadAsync(new Uri("http://www.thesite.com/stream.wma", UriKind.Absolute));

Il problema vero è nato quando ho cercato di regolare il volume, semplicemente agganciando uno slider alla proprietà Volume di MediaElement ovvero qualcosa tipo:

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
  me.Volume = slider1.Value;
}

e qui non c’è stato verso di farlo funzionare.

Dopo svariate prove e successiva conferma da parte del team di Silverlight ho scoperto l’inghippo e quindi anche il motivo percui l’assegnazione dell’Uri allo stream non funzionava: Ogni MediaElement deve far parte di un Visual Tree.
Aggiungendo il MediaElement al visual tree oppure semplicemente definendo lo stesso direttamente via XAML sembra risolvere tutti i problemi, certo per questa particolare necessità (in questo caso non ho nulla da visualizzare) mi sembra di essere tornato ai tempi di VB6 dove le form erano piene di controlli invisibili a run-time, ma è pur vero che normalmente un MediaElement è spesso legato ad un video e quindi la presenza nella UI è più che normale.

Technorati Tags: