WPF: L’importanza dell’evento MediaFailed
La classe MediaElement di Windows Presentation Foundation mette a disposizione l’evento MediaFailed, al quale possiamo sottoscriverci per gestire tutti i casi in cui il player di WPF non riesca per qualche motivo a renderizzare il contenuto impostato dal source, sia esso video ed audio.
Questa sera, mentre il mio amico Fabio guidava, io ero di fianco a lui con il notebook aperto e ho buttato giù due linee di XAML. Eccole qua:
1 <StackPanel Orientation="Vertical"> 2 3 <MediaElement Name="WaitingAnimation" Width="100"> 4 <MediaElement.Triggers> 5 <EventTrigger RoutedEvent="MediaElement.Loaded"> 6 <EventTrigger.Actions> 7 <BeginStoryboard> 8 <Storyboard> 9 <MediaTimeline Source="C:UsersIgorDesktopLogoVivendoByte.avi" 10 Storyboard.TargetName="WaitingAnimation" 11 RepeatBehavior="Forever" /> 12 </Storyboard> 13 </BeginStoryboard> 14 </EventTrigger.Actions> 15 </EventTrigger> 16 </MediaElement.Triggers> 17 </MediaElement> 18 19 <Label Content="Please wait! Retrieving tags from Technorati..." 20 FontSize="12" 21 Foreground="Blue" 22 VerticalContentAlignment="Center" 23 HorizontalContentAlignment="Center" /> 24 25 </StackPanel>
Per chi ha un po’ di dimestichezza con WPF, vedrà che non è nulla di trascendentale. C’è uno StackPanel che contiene un MediaElement ed una Label. Il MediaElement utilizza un file AVI sul mio PC, e fa in modo che venga ripetuto continuamente fino a quando la finestra non viene chiusa. Mentre sul mio PC a casa con Vista, tutto gira senza problemi, sul notebook proprio non riuscivo a vedere il video. Ho provato a semplificare lo XAML, ma niente. Ho provato ad aprire il file AVI con Windows Media Player e con VLC: tutto ok, il file è valido ed il filmato pure. E allora, come cacchio è che la mia Windows non renderizza nulla?
Ho provato di tutto, come settare LoadedBehavior=”Player” sul MediaElement, e altri tentativi che adesso non ricordo nemmeno più. Alla fine, ho provato un’ultima cosa: ho provato a gestire l’evento MediaFailed, dato che dopo un po’ ho cominciato ad intuire che fosse proprio WPF che, per qualche motivo, non riesce a far vedere il video.
Quindi, modifico la linea (3) del codice qui sopra con il seguente XAML…
<MediaElement Name="WaitingAnimation" Width="100" MediaFailed="WaitingAnimation_MediaFailed">
..e nel code-behind in C# vado a gestire l’event-handler con un banale:
private void WaitingAnimation_MediaFailed(object sender, ExceptionRoutedEventArgs e) { MessageBox.Show(e.ErrorException.ToString()); }
Ho scoperto l’arcano. Viene effettivamente sollevata un’exception, che mi informa che devo installare Windows Media Player 10 per visualizzare quel video!!! La cosa che non mi ha affatto convinto è che nessuno mi diceva niente: WPF semplicemente si rifiutava di farmi il video, senza avvisarmi di nulla, senza darmi errori a runtime!!!!
Dopo aver installato WMP10, tutto è andato regolarmente, ma tutto questo mi ha lasciato un pochino basito, perchè legare così tanto WPF con un player specifico, imho, non va affatto bene. Capisco bene che quando si installa WMP10 vengono installati driver, codec e chissà che altro, però bisogna rendersi conto che c’è tanta gente che si rifiuta di installare WMP10 perchè non lo userà mai e poi mai, ed è assurdo che a causa di questo motivo anche un software di terze parti come il mio potrebbe fallire in qualche modo.
Technorati Tags: .net world wpf .NET Framework video