如何在Windows Phone中传递对象到后台项目
本文关键字:对象 后台 项目 Windows Phone | 更新日期: 2023-09-27 18:17:25
我的问题是,我有一个StorageFile
对象的前景,并希望在BackgroundMediaPlayer这样播放它:
mediaPlayer.SetFileSource(soundStorageFile);
但是不可能在前台使用SetFileSource()
,你应该在后台任务中调用它,或者在后台初始化第三个项目,然后从那里调用它。
那么我如何将对象传递给后台项目呢?
(这是一个Windows Phone运行时应用程序)
UI和BackgroundMediaPlayer之间的通信可以通过发送消息来完成:
一个简单的通信机制在前台和后台进程中引发事件。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));