2010-01-14 74 views
2

MediaElement控件存在問題。我在表單上放置了六個MediaElement,然後啓動它們並通過定時器更改播放的文件。 幾次後,這些元素停止播放。MediaElement在多次播放後失敗

下面是示例XAML:

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="*" /> 
</Grid.RowDefinitions> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition Width="*" /> 
</Grid.ColumnDefinitions> 
<MediaElement x:Name="element1" UnloadedBehavior="Close" LoadedBehavior="Manual" Grid.Column="0" Grid.Row="0" /> 
<MediaElement x:Name="element2" UnloadedBehavior="Close" LoadedBehavior="Manual" Grid.Column="1" Grid.Row="0" /> 
<MediaElement x:Name="element3" UnloadedBehavior="Close" LoadedBehavior="Manual" Grid.Column="2" Grid.Row="0" /> 
<MediaElement x:Name="element4" UnloadedBehavior="Close" LoadedBehavior="Manual" Grid.Column="0" Grid.Row="1" /> 
<MediaElement x:Name="element5" UnloadedBehavior="Close" LoadedBehavior="Manual" Grid.Column="1" Grid.Row="1" /> 
<MediaElement x:Name="element6" UnloadedBehavior="Close" LoadedBehavior="Manual" Grid.Column="2" Grid.Row="1" /> 

下面是示例代碼:

// The code below repeats for each MediaElement

List<string> playlist1 = new List<string>() 
{ 
    @"file1.wmv", 
    @"file2.wmv", 
    @"file3.wmv", 
    @"file4.wmv" 
}; 
DispatcherTimer timer1 = null; 
int index1 = 0; 
... 
void Window1_Loaded(object sender, RoutedEventArgs e) 
{ 
    timer1 = new DispatcherTimer(); 
    timer1.Tick += new EventHandler(timer1_Elapsed); 
    timer1.Interval = TimeSpan.FromSeconds(10); 
    element1.Source = new Uri(playlist1[index1]); 
    timer1.Start(); 
    element1.Play(); 
    ... 
} 
void timer1_Elapsed(object sender, EventArgs e) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Normal, (System.Threading.ThreadStart)delegate() 
    { 
     element1.Stop(); 
     element1.Close(); 
     timer1.Stop(); 
     index1++; 
     if (index1 >= playlist1.Count) 
     { 
      index1 = 0; 
     } 
     element1.Source = new Uri(playlist1[index1]); 
     timer1.Start(); 
     element1.Play(); 
    }); 
} 

...

是否有人有類似的問題?

回答

2

我也有類似的問題,發現唯一的解決辦法是動態創建媒體元素。下面是代碼,我在XAML中有一個名爲mePlayClick的MediaElement,但您可能不需要或不需要。

private void Play_MediaSound() 
    { 
     // Create new media element dynamically 
     MediaElement mediaElement = new MediaElement(); 

     // Reuse settings in XAML 
     mediaElement.Volume = mePlayClick.Volume; 
     mediaElement.Source = mePlayClick.Source; 
     mediaElement.AutoPlay = mePlayClick.AutoPlay; 

     // WHen the media ends, remove the media element 
     mediaElement.MediaEnded += (sender, args) => 
     { 
      LayoutRoot.Children.Remove(mediaElement); 
      mediaElement = null; 
     }; 

     // Add the media element, must be in visual ui tree 
     LayoutRoot.Children.Add(mediaElement); 

     // When opened, play 
     mediaElement.MediaOpened += (sender, args) => 
     { 
      mediaElement.Play(); 
     }; 
    }