2017-04-18 62 views
6

我有兩頁說Page1和page2。 In Page-1我有一個列表視圖和圖像按鈕(點擊手勢)。 這裏,如果我點擊listview項目,它將導航到Page2,其中 播放歌曲。導航在Xamarin.Forms

Navigation.PushModalAsync(new page2(parameter1)); 

歌曲繼續播放。然後我通過點擊返回按鈕回到page1。然後如上所述,我在第一頁有一個圖像按鈕,如果我點擊這個圖像按鈕,我想用同樣的狀態歌曲繼續播放(它不應該從頭開始播放),前面顯示的同一頁(第2頁)。

據我所知,如果我點擊後退按鈕,它會銷燬模型頁面。出於某種原因,我不能使用pushasync()。 這可能嗎?

+0

當關閉網頁時保存回歌曲和它的位置,在頁面中出現的事件設置位置 – Krishna

+0

首先什麼來銘記是有這個頁面作爲單,並通過作爲參數傳遞給'PushModalAsync() ',不是每次都創建它 – Alex

+0

我認爲這是可能的,你可以獲得歌曲的暫停狀態並使用MessagingCenter將其保存在ViewModel中,當頁面啓動時,您應該能夠從VM中檢索數據並播放從它被暫停的地方發出的歌曲。 – Dilmah

回答

4

建議不要將音頻/媒體播放器邏輯與導航邏輯或頁面對象緊密結合在一起 - 尤其是當您希望它在後臺繼續播放時。

簡單的方法將有贊同MessengingCenter的音頻播放器命令的AudioPlayerService類 - 如播放,暫停等。當播放命令發佈後,它可以啓動一個後臺線程來播放音頻文件。

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

現在,當你從第1頁第2頁到導航,你可以發佈/通過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 
} 

而且,使用下面的代碼來控制你的音頻播放器服務在你的頁面/視圖模型對象。

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

我知道這one..but你不覺得,歌曲將從頭開始播放.. –

+0

@uncle_scrooge這是一個正確的答案,根本就沒有開始播放歌曲的'OnAppearing'事件,檢查如果歌曲已經在播放如果它不是重新開始。如果你想要真正的幫助,請添加你的代碼。 – Gusman

+0

我問這個問題的意圖是,一旦我們回去,是否有一種方法可以隱藏頁面,就像我們對控件(可見性)所做的一樣,因爲模態頁面會被破壞。 –