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