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:
MediaElement