Xamarin.Forms中的导航

6

我有两个页面,分别是Page1和Page2。 在Page1页面上,我有一个列表视图和一个图片按钮(点击手势)。 如果我点击列表视图项目,它会导航到Page2页面,在那里播放一首歌曲。

Navigation.PushModalAsync(new page2(parameter1));

歌曲继续播放。然后我通过点击返回按钮回到页面1。如上所述,页面1中有一个imagebutton,如果我点击此imagebutton,我希望转到之前显示的相同页面(page2),并且状态相同,即歌曲继续播放(它不应从头开始播放)。

我明白,如果我点击返回按钮,它会销毁模型页面。由于某种原因,我不能使用pushasync()。这可能吗?


关闭页面时,在返回保存歌曲及其位置,出现页面事件设置位置。 - Krishna
首先想到的是将该页面设置为单例,并将其作为参数传递给 PushModalAsync(),而不是每次都创建它。 - Alex
我认为这是可能的,你可以使用MessagingCenter获取歌曲的暂停状态并将其保存在ViewModel中。当页面再次启动时,你应该能够从VM中检索数据,并从暂停的位置播放歌曲。 - Dilmah
你能提供下“背景中应该播放的歌曲”更多的细节吗? 你用什么进行音频播放?也许可以分享一个基本演示以展示你正在尝试什么。 - Elvis Xia - MSFT
歌曲播放意味着...它可以是任何歌曲...但我的问题是关于导航,基本上当我在页面1中单击listview项目时,在页面2中开始播放歌曲,然后当我单击返回按钮时,它回到页面1,直到现在歌曲应该继续播放,现在在页面1中,当我单击图像按钮(例如,图像可以是正在播放的...图像),它应该显示带有继续播放歌曲的页面2。 - uncle_scrooge
显示剩余4条评论
2个回答

4
不建议将音频/媒体播放器逻辑与导航逻辑或页面对象紧密耦合 - 特别是如果您希望它在后台继续播放。最简单的方法是拥有一个AudioPlayerService类,该类订阅MessengingCenter以获取音频播放器命令,例如播放、暂停等。当发布播放命令时,它可以启动一个后台线程来播放音频文件。
MessagingCenter.Subscribe<Page2, AudioPlayerArgs> (this, "Play", (sender, args) => {
      // initiate thread to play song
});

现在,当您从页面1导航到页面2时,可以通过MessengingCenter向AudioPlayerService类发布/发送命令以开始播放歌曲。这样,无论在页面1或页面2之间来回多少次,音频播放器都不会受到影响,因为如果它已经播放相同的音频文件,它可以忽略播放命令。
MessagingCenter.Send<Page2, AudioPlayerArgs> (this, "Play", new AudioPlayerArgs("<sound file path>"));

注意: 我个人避免在我的代码中使用MessengingCenter - 更好的方法是引入一个接口用于IAudioPlayerService,并使用适当的方法来播放、暂停等,然后使用DependencyService来维护AudioPlayerService状态作为全局对象(这是默认行为)

public interface IAudioPlayerService {
     bool PlayAudio(string file);
     bool PauseAudio();
     bool StopAudio();
}

[assembly: Xamarin.Forms.Dependency (typeof (IAudioPlayerService))]
public class AudioPlayerService : IAudioPlayerService {
      //implement your methods
}

使用以下代码在您的页面/视图模型对象中控制音频播放器服务。

DependencyService.Get<IAudioPlayerService>().Play("<sound file path>");

我在想是否可以在这种情况下使用MVVM light - mbob

2
您可以尝试传递全局或局部变量的同一实例,具体取决于情况:
var secondpage = new page2(parameter1); // Global scope.
...
Navigation.PushModalAsync(secondpage);

希望这有所帮助。

@uncle_scrooge 这是正确的答案,只需不要在“OnAppearing”事件中开始播放歌曲,检查歌曲是否已经在播放,如果是,则不要再次开始。如果需要真正的帮助,请添加您的代码。 - Gusman
我提出这个问题的意图是,是否有一种方法可以像我们对控件进行隐藏(可见性)一样隐藏页面,因为模态页面在返回后会被销毁。 - uncle_scrooge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接