2014年9月13日 星期六

Store Apps 的 MediaElement 注意事項

利用 MediaElement 播放音樂是在 Windows 所有框架中最簡單的方式,為了讓音樂可以不受到畫面切換而中斷,常常會將 MediaElement 放在 Application class 中或一些類似 Singleton 的物件中使用。

但這招在 Windows Store Apps 中目前是行不通的,測試發現若將 MediaElement 放在 Page 的 XAML 以外的地方似乎都不會有作用,測試的流程是先建立一個 Universal App 並在 Shared Project 中建立一個名為 Assets 的資料夾並加入一個 Sound.mp3 的音樂檔案,在 Windows 或 Windows Phone 任一專案中,將 MediaElement 加入 MainPage.xaml 中如下

<StackPanel>
    <MediaElement x:Name="XAMLPlayer"/>
</StackPanel>

在 Page 的 Load 事件中加入

private void OnPageLoaded(object sender, RoutedEventArgs e)
{
    XAMLPlayer.AutoPlay = true;
    XAMLPlayer.Source = new Uri("ms-appx:///Assets/sound.mp3");
}

在這種撰寫方式下應用程式開啟時會正常的播出歌曲,但是如果改成在 MainPage.xaml 以外的部份宣告 MediaElement 來使用,例如以下示範的,加在 MainPage.xaml.cs 中

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    public MediaElement Player;

    private void OnPageLoaded(object sender, RoutedEventArgs e)
    {
        Player = new MediaElement();
        Player.AutoPlay = true;
        Player.Source = new Uri("ms-appx:///Assets/sound.mp3");
    }
}

會發現這種撰寫方式是沒作用的,另外我也試過放在 App.xaml 中一樣是沒作用的,所以在 Windows Store Apps 中如果要使用全域的 MediaElement,目前得放在 Page 的 XAML 檔中,並且在這個 Page 加入 Frame,讓這個 Frame 負責應用程式內所有頁面的導覽工作,簡單的範例如下

<Grid>
    <MediaElement x:Name="KKBOXMediaElement" AudioCategory="BackgroundCapableMedia"/>
    <Frame Margin="0" x:Name="MainFrame"/>
</Grid>



沒有留言:

張貼留言