2017-05-25 36 views
0

我與Xamarin.Forms新,我想知道如何切換到「以前加載」頁面。Xamarin在頁面之間切換的最佳習慣?

讓我說我的應用程序運行,並加載(作爲第一頁)我的MainPage。在那裏,我調整了一些按鈕/切換(改變狀態),而且比我點擊一個按鈕,將加載其他頁面(使用Navigation模型):

await Navigation.PushAsync(new MyNewPage()); 

現在,這裏我想回到以前的MainPage

await Navigation.PushAsync(new MainPage()); 

但是在這一點上,所有的內容/按鈕狀態都消失了(基本上它創建了一個新的MainPage)。

既然它是一個LIFO,我將它放在內存/堆棧上。我怎樣才能回憶以前加載MainPage?或者GC有可能在任何時候清理它,這是否危險?

請注意,在這種特定的情況下,這作品(因爲我剛回來一次):

await Navigation.PopAsync(); 

但我想使用選擇性計算策略(叫什麼,我需要我在哪裏,學習整個概念)。

回答

1

需要注意的一件事是,您用於Push and Pop的Navigation對象具有NavigationStack屬性,您可以使用該屬性獲取以前推送的頁面 - 假設您沒有彈出它們。

據我所知,沒有任何方法可以直接導航到現有Page在堆棧中,所以你可能需要得到你的方法有所創新。

如果MainPage隨時爲您NavigationStack的底部,你可以使用

await Navigation.PopToRootAsync() 

回去了Page在堆棧的底部。

如果'MainPage'可以在堆棧中的其他地方,那麼您可能必須保留自己的列表Page s與NavigationStack分開。

,如果你不關心保持MainPage和當前頁面之間的Page就像下面的內容可能工作:

注意,你將要創建一個單獨的PageList s到刪除的通話RemovePage()就在foreach循環的NavigationStack有時會導致異常,東西的「枚舉無法完成,收集了變化」的效果:

List<Page> pagesToRemove = new List<Page>(); 
foreach(Page page in Navigation.NavigationStack) 
{ 
    if(page.GetType() != typeof(MainPage) && page != Navigation.NavigationStack.Last()) 
    { 
     pagesToRemove.Add(page); 
    } 
} 
// pagesToRemove now contains all Pages between your current page and MainPage 

foreach(Page pageToRemove in pagesToRemove) 
{ 
    Navigation.RemovePage(pageToRemove); 
} 
// the NavigationStack only contains MainPage (now the root) and your current page 

// Pop to MainPage 
await Navigation.PopAsync(); 

有一天它會很高興有一個NavigateTo(Page)或類似的,但現在這種方法似乎工作。

相關問題