在Xamarin.Forms中导航

unc*_*oge 6 .net c# xamarin.android xamarin xamarin.forms

我有两页说Page1和page2.在Page-1中,我有一个列表视图和一个图像按钮(点击手势).在这里,如果我点击listview项目,它会导航到播放歌曲的Page2.

Navigation.PushModalAsync(new page2(parameter1));
Run Code Online (Sandbox Code Playgroud)

宋继续发挥.然后我点击后退按钮返回第1页.然后如上所述,我在第1页有一个图像按钮,如果我点击这个图像按钮,我想要进入前面显示的相同页面(第2页),同样的状态歌继续播放(它不应该从头开始播放).

据我所知,如果单击后退按钮,它会破坏模型页面.出于某种原因,我不能使用pushasync().这可能吗?

Sha*_*raj 4

建议不要将音频/媒体播放器逻辑与导航逻辑或页面对象紧密耦合 - 特别是如果您希望它继续在后台播放。

最简单的方法是使用一个 AudioPlayerService 类来订阅MessengingCenter的音频播放器命令 - 例如播放、暂停等。当发布播放命令时,它可以启动一个后台线程来播放音频文件。

MessagingCenter.Subscribe<Page2, AudioPlayerArgs> (this, "Play", (sender, args) => {
      // initiate thread to play song
});
Run Code Online (Sandbox Code Playgroud)

现在,当您从 page1 导航到 page2 时,您可以通过MessengingCenter向 AudioPlayerService 类发布/发送命令以开始播放歌曲。这样,第 1 页或第 2 页之间的任何次数的来回都不会影响音频播放器,因为如果它已经在播放相同的音频文件,它可以忽略播放命令。

MessagingCenter.Send<Page2, AudioPlayerArgs> (this, "Play", new AudioPlayerArgs("<sound file path>"));
Run Code Online (Sandbox Code Playgroud)

注意:我个人避免在代码中使用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
}
Run Code Online (Sandbox Code Playgroud)

并且,使用以下代码来控制 Page/ViewModel 对象中的音频播放器服务。

DependencyService.Get<IAudioPlayerService>().Play("<sound file path>");
Run Code Online (Sandbox Code Playgroud)