2017-04-18 8 views
6

Page1とpage2という2つのページがあります。 Page-1私はリストビューと画像ボタン(タップジェスチャー)を持っています。 ここでlistviewアイテムをクリックすると、Page2に移動します。 が再生されます。Xamarin.Formsでのナビゲーション

Navigation.PushModalAsync(new page2(parameter1)); 

ソングが引き続き再生されます。その後、戻るボタンをクリックしてpage1に戻ります。その後、私はpage1にimagebuttonを持っていますが、私がこの画像ボタンをクリックすると、前のページ(page2)と同じステータスの曲を再生し続けます(最初から再生しないでください)。

私は、戻るボタンをクリックすると、モデルページが破棄されることを理解しています。何らかの理由でpushasync()を使用できません。 これは可能ですか?

+0

ときに近いページバック時に)何気に来たことはシングルトンとしてそのページを持っている、と 'PushModalAsync(にパラメータとして渡すことですイベント設定位置 – Krishna

+0

最初に登場するページでは、歌とその位置を保存'、毎回作成しないでください – Alex

+0

私はそれが可能であると思います。あなたはSongの一時停止状態を取得し、それをViewModelでMessagingCenterを使用して&再びページが起動されたときにVMに保存して再生できるはずです一時停止した場所の曲。 – Dilmah

答えて

4

オーディオ/メディアプレーヤーのロジックをナビゲーションロジックやページオブジェクトと強く結びつけないようにすることをお勧めします。特にバックグラウンドで再生を続けたい場合は、こうした遊びなどなどを一時停止再生コマンドが公開されると、それはオーディオファイルを再生するには、バックグラウンドスレッドを開始することができます -

最も簡単な方法は、オーディオプレーヤーコマンドのMessengingCenterに加入してAudioPlayerServiceクラスを持っているだろう。あなたはページ1からページ2に移動したときに

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

さて、あなたは、曲の再生を開始するMessengingCenterを通じてAudioPlayerServiceクラスにコマンドを送信/公開することができます。このようにして、page1またはpage2の間での前後の任意の回数は、すでに同じオーディオファイルを再生している場合に再生コマンドを無視できるため、オーディオプレーヤーには影響しません。

MessagingCenter.Send<Page2, AudioPlayerArgs> (this, "Play", new AudioPlayerArgs("<sound file path>")); 

注:私は個人的に私のコードでMessengingCenterの使用を避ける - などを一時停止し、より良いアプローチではなく、再生するために適切な方法でIAudioPlayerServiceするためのインタフェースを導入することであろうとしてAudioPlayerService状態を維持するためにDependencyServiceを使用グローバルオブジェクト(デフォルト動作)

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>"); 
+0

この状況で[MVVM light](https://mvvmlight.codeplex.com)を使用できるかどうか疑問に思っています – mbob

2

あなたは適切であるものは何でも、グローバルまたはローカル変数の同じインスタンスを渡ししようとするかもしれない:

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

はそれがお役に立てば幸いです。

+0

私はこれを知っていますが、あなたは思っていません、曲は最初から再生されます.. –

+0

@uncle_scroogeこれは正解です。「OnAppearing」イベントで曲を再生し始めるだけでなく、それがそうであれば、それをもう一度開始しないでください。本当の助けが必要な場合は、コードを追加してください。 – Gusman

+0

この質問をする私の意図は、私たちが戻ったらモーダルページとしてコントロール(visiblity)のようにページを隠す方法があるかどうかです。 –

関連する問題