如何在Windows Phone中传递对象到后台项目

本文关键字:对象 后台 项目 Windows Phone | 更新日期: 2023-09-27 18:17:25

我的问题是,我有一个StorageFile对象的前景,并希望在BackgroundMediaPlayer这样播放它:

mediaPlayer.SetFileSource(soundStorageFile);

但是不可能在前台使用SetFileSource(),你应该在后台任务中调用它,或者在后台初始化第三个项目,然后从那里调用它。

那么我如何将对象传递给后台项目呢?

(这是一个Windows Phone运行时应用程序)

如何在Windows Phone中传递对象到后台项目

UIBackgroundMediaPlayer之间的通信可以通过发送消息来完成:

一个简单的通信机制在前台和后台进程中引发事件。SendMessageToForeground和SendMessageToBackground方法分别调用相应任务中的事件。数据可以作为参数传递给接收任务中的事件处理程序。

SendMessageToBackground通过ValueSet传递一个简单的对象。一旦你把它发送到你的BMP实例,然后MessageReceivedFromForeground事件被引发,你可以从MediaPlayerDataReceivedEventArgs读取传入的对象

在你的例子中,你可以传递一个带有文件路径的字符串给你的播放器:

// the UI code - send from Foreground to Background
ValueSet message = new ValueSet();
message.Add("SetTrack", yourStorageFile.Path); // send path (string)
BackgroundMediaPlayer.SendMessageToBackground(message);

然后,正如我所说的-适当的事件是(应该)由Player实例引发:

private async void BMP_MessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e)
{
    foreach (string key in e.Data.Keys)
    {
        switch (key)
        {
            case "SetTrack":
                string passedPath = (string)e.Data.Values.FirstOrDefault();
                //here code you want to perform - change track/stop other 
                // that depends on your needs
                break;
     // rest of the code

我强烈建议阅读MSDN上提到的概述,调试你的程序,看看它是如何工作的。


另一方面,如果你只想从文件中设置跟踪,你可以尝试这样做(你不能在UI中设置FileSource -这是真的,但你可以使用SetUriSource):

// for example playing the first file from MusicLibrary (I assume that Capabilities are set properly)
StorageFile file = (await KnownFolders.MusicLibrary.GetFilesAsync()).FirstOrDefault();
BackgroundMediaPlayer.Current.SetUriSource(new Uri(file.Path, UriKind.RelativeOrAbsolute));