【问题标题】:Navigation in Xamarin.FormsXamarin.Forms 中的导航
【发布时间】:2017-09-14 08:34:45
【问题描述】:

我有两个页面,分别是 Page1 和 page2。 在第 1 页中,我有一个列表视图和一个图像按钮(点击手势)。 在这里,如果我单击 listview 项目,它会导航到 Page2 其中 它会播放一首歌。

Navigation.PushModalAsync(new page2(parameter1));

歌曲继续播放。然后我通过单击返回按钮返回第 1 页。然后如前所述,我在第 1 页有一个图像按钮,如果我单击此图像按钮,我想转到前面显示的同一页面(第 2 页),并且具有相同的状态歌曲继续播放(它不应该从头开始播放)。

我明白,如果我点击后退按钮,它会破坏模型页面。出于某种原因,我不能使用 pushasync()。 这可能吗?

【问题讨论】:

  • 在后台关闭页面时保存歌曲及其位置,在页面出现事件设置位置
  • 首先想到的是将该页面作为单例,并作为参数传递给PushModalAsync(),而不是每次都创建它
  • 我认为这是可能的,您可以获取歌曲的暂停状态并使用 MessagingCenter 将其保存在 ViewModel 中,当页面启动时,您应该能够从 VM 检索数据并播放暂停的歌曲。
  • 我不能暂停..歌曲应该在后台播放
  • 您能提供更多关于“歌曲应该在后台播放”的详细信息吗?你用什么来播放音频的?也许分享一个基本的演示来展示你正在尝试什么。

标签: c# .net xamarin xamarin.android xamarin.forms


【解决方案1】:

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

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

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

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

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
}

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

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

【讨论】:

  • 我想知道在这种情况下是否可以使用MVVM light
【解决方案2】:

您可以尝试传递全局或局部变量的相同实例,只要合适:

var secondpage = new page2(parameter1); // Global scope.
...
Navigation.PushModalAsync(secondpage);

希望对你有帮助。

【讨论】:

  • @uncle_scooge 这是正确的答案,只是不要在OnAppearing 事件上开始播放歌曲,检查歌曲是否已经在播放,如果已经播放,则不要再次播放。如果您需要真正的帮助,请添加您的代码。
  • 我问这个问题的意图是,是否有一种方法可以像我们对控件(可见性)所做的那样隐藏页面,因为一旦我们返回模式页面就会破坏。
猜你喜欢
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多