2010-03-22 176 views
2

我有一個變量MediaElement變量名爲TestAudio在我的Silverlight應用程序中。播放MediaElement後,如何再次播放?

當我點擊按鈕時,它會正確播放音頻

但是當我再次單擊按鈕時,它不播放音頻。

如何讓MediaElement第二次播放?

無下面的嘗試把位置回到0工作:

private void Button_Click_PlayTest(object sender, RoutedEventArgs e) 
{ 
    //TestAudio.Position = new TimeSpan(0, 0, 0); 
    //TestAudio.Position = TestAudio.Position.Add(new TimeSpan(0, 0, 0)); 
    //TestAudio.Position = new TimeSpan(0, 0, 0, 0, 0); 
    //TestAudio.Position = TimeSpan.Zero; 

    TestAudio.Play(); 
} 

回答

7

我發現了它,你就必須停止音頻第一,然後設置位置:

TestAudio.Stop(); 
TestAudio.Position = TimeSpan.Zero; 
+0

我也這麼認爲,但它不適用於我:( – Sinaesthetic

+0

我不得不做停止()而不是停止。啞。 – Sinaesthetic

2

我發現上面的代碼不適合我,而且我能夠正常工作的唯一方法就是動態創建一個mediaelement。下面是我使用的代碼 - 我複製了一個名爲mePlayClick的MediaElement中的值,最初放在XAML中,但您可能不需要這樣做。

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(); 
     }; 
    } 
2

MediaElement沒有內置的循環播放支持。您可以使用MediaEnded事件並簡單地將媒體位置設置爲零,或者您可以調用Stop()方法。任何一個人都會將您置於播放視頻/音頻的開始位置。

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     // Required to initialize variables 
     InitializeComponent(); 
     // Used for loopback. 
     MyME.MediaEnded += new RoutedEventHandler(MyME_MediaEnded); 
    } 

    // MediaElement has no looping capabilities so need to set the position back 
    // to the begining after the video finishes in order to play again. 
    // Or you can use the stop method 
    void MyME_MediaEnded(object sender, RoutedEventArgs e) 
    { 
     //MyME.Position = TimeSpan.Zero; 
     MyME.Stop(); 
    } 

    private void BtnPlay_Click(object sender, RoutedEventArgs e) 
    { 

     MyME.Play(); 
    } 

    private void BtnPause_Click(object sender, RoutedEventArgs e) 
    { 
     MyME.Pause(); 
    } 

    private void BtnStop_Click(object sender, RoutedEventArgs e) 
    { 
     MyME.Stop(); 
    } 

}