2016-08-22 92 views
0

我使用Xamarin.Forms 2.3.1.114來構建跨平臺的應用程序。我從UWP應用程序開始,現在調試爲桌面應用程序。Xamarin:詳細的MasterDetailPage後退按鈕

這是當前的導航路徑:

主菜單(ContentPage) - >內容(MasterDetailPage)

MasterDetailPage:

- >主站(ContentPage)包含經由ListView中示出的項目的列表

- >詳細(ContentPage)從一個單一的列表項

的Xamarin文檔顯示數據說:

詳細信息頁面通過將MasterDetailPage.IsPresented屬性設置爲false呈現給用戶。

https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/master-detail-page/

所以,我提出在母版頁的公共ListView控件,並添加代碼類同以下的MasterDetailPage:

public MyMasterDetailPage() 
{ 
    this.Master.ItemsListView.ItemSelected += MasterListView_ItemSelected; 
} 

private void MasterListView_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
{ 
    if (this.Master.ItemsListView.SelectedItem == null) 
    { 
     return; 
    } 

    this.Detail.BindingContext = this.Master.ItemsListView.SelectedItem; 

    this.IsPresented = false; 
} 

詳細信息頁面顯示所選項目的詳細信息,所以這工作正常。

但是,有一個後退按鈕顯示。在詳細信息頁面上,後退按鈕將我帶回主菜單內容頁面,而不是主頁面,這將成爲我眼中的預期行爲。什麼是實現這種行爲的預期方式?

這裏是我試過:

當然,這種行爲是因爲詳細信息頁面沒有被壓入導航堆棧。在ItemSelected事件中推送那裏的Detail頁面實例會導致一個exeption,因爲它的Parent屬性已經設置。

我試過在設置MasterDetailPage的Detail屬性時在導航頁面中包裝了Detail頁面,但是這樣可以防止後退按鈕顯示,這顯然是由導航聲明導航堆棧或沿着這些行的東西導致的。我也試着讓DetailPage繼承自NavigationPage而不是ContentPage,結果相同。

我不確定我是否在這裏尋找正確的東西,在我看來,就像我對MasterDetailPages應該被使用的方式有一些誤解。任何幫助表示讚賞。

這是顯示此行爲的項目。

https://1drv.ms/u/s!At78FKXjEGEohocQQgxaZuCYT2rwMw

啓動UWP應用程序,點擊「列表」,點擊左側的任何項目。點擊後退按鈕,你應該看到我的問題。

+0

丹尼爾你好,你說的是當前的代碼,使後退按鈕可見,你是怎麼做的?任何演示將有助於理解您的問題。如果您選擇MasterDetailPage,則使用導航頁面來適合您的場景 –

+0

您好富蘭克林,我在帖子的末尾添加了一個有問題項目的鏈接,詳細信息頁面應該只填充TabbedPage,NavigationPage和ContentPage實例。我沒有做任何特別的事情來讓後退按鈕顯示出來,由於存在導航堆棧,它必須是自動的。 –

回答

0

當處於詳細信息頁面時,後退按鈕將我帶回主菜單內容頁面,而不是Master頁面,這將成爲我眼中的預期行爲。什麼是實現這種行爲的預期方式?

是的,你的假設是正確的,這是由於導航返回堆棧中缺少特定的頁面。

Xamarin Master Detail頁面的默認行爲無法實現您的完整需求。

在這種情況下正確的方法是使用Navigation.PushAsync。此方法將頁面異步添加到導航堆棧的頂部。

因爲它的Parent屬性已經設置,所以在ItemSelected事件中推送那裏的Detail頁面實例會導致一個exeption。

看起來你已經assinged MasterDetailPage的詳細屬性在XAML

<MasterDetailPage.Detail> 
    <pages:LeadDetailPage /> 
    </MasterDetailPage.Detail> 

請直接添加ContentPage堆棧,這將正確地讓你的導航。

使用在LeadsMainPage.xmal.cs文件下面的代碼:

private void LeadsList_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
{ 
      if (_masterPage.LeadsList.SelectedItem == null) 
      { 
       return; 
      } 

      ContentPage detailpage = new LeadDetailPage(); 
      detailpage.BindingContext= _masterPage.LeadsList.SelectedItem; 
      Navigation.PushAsync(detailpage); 

      this.IsPresented = false; 
} 

截圖: enter image description here

+0

謝謝,這當然有效。但有幾件事情:使用這種方法我根本沒有看到任何理由使用MasterDetailPage。另外,一旦我到達其他平臺(這是iOS上默認的我認爲的),左右劃像在Master和Detail之間切換的行爲將不再起作用。我假設MasterDetailPage將所有這些主要細節行爲帶到同一頁面下,但感覺這根本不是它的目的。那麼使用MasterDetailPage的正確場景究竟是什麼,如果不是我現在的那個? –

+1

根據我的經驗,MasterDetailPage的行爲有點像[UWP中的漢堡菜單](https://blogs.msdn.microsoft.com/quick_thoughts/2015/06/01/windows-10-splitview-build-your -first-hamburger-menu /),但通過使用SplitView控件,漢堡菜單支持左上角標題欄上的導航後退按鈕。在Xamarin中,它沒有添加這種情況的支持。 UWP中常用的方法Template10是推薦模板:https://github.com/Windows-XAML/Template10/wiki –