2016-08-22 6 views
0

Я использую Xamarin.Forms 2.3.1.114 для создания кросс-платформенного приложения. Я начинаю с приложения UWP, сейчас отлаживая его как настольное приложение.Xamarin: кнопка «Назад» в деталях от MasterDetailPage

Это текущий путь навигации:

Главное меню (ContentPage) -> Содержание (MasterDetailPage)

MasterDetailPage:

-> Мастер (ContentPage) содержит список элементов, показывающий с помощью ListView

-> Detail (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; 
} 

На странице подробно показаны детали выбранного элемента , так что это работает нормально.

Тем не менее, есть кнопка назад. Когда вы находитесь на странице «Детали», кнопка «Назад» возвращает меня на страницу содержимого главного меню, в отличие от главной страницы, которая была бы ожидаемым поведением в моих глазах. Каков предполагаемый способ достижения такого поведения?

Вот что я пробовал:

Конечно, это поведение, потому что Detail страница не была нажата в навигационный стек. Нажатие экземпляра страницы Detail в нем в событии ItemSelected вызывает exeption, поскольку его свойство Parent уже установлено.

Я попытался обернуть страницу «Сведения» на странице навигации при настройке свойства «Detail» в MasterDetailPage, но это предотвратит показ кнопки «Назад», что, по-видимому, вызвано тем, что NavigationPage требует стек навигации или что-то в этом направлении , Я также попытался сделать страницу Detail наследуемой от NavigationPage, а не ContentPage, с тем же результатом.

Я не уверен, что я здесь искал, мне кажется, что у меня есть недоразумение в том, как предполагается использовать MasterDetailPages. Любая помощь приветствуется.

Это проект, демонстрирующий это поведение.

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

Запустите UWP приложение, нажмите на кнопку «Список», нажмите на любой элемент слева. Нажмите кнопку «Назад», и вы увидите мою проблему.

+0

Привет Даниэль, вы сказали, что текущий код делает Назад Кнопка видна, как вы сделали это ? Любая демонстрация будет полезна для понимания вашего вопроса. Страница детализации должна быть заполнена только экземплярами TabbedPage, NavigationPage и ContentPage, если вы выбираете MasterDetailPage, NavigationPage используется для вашего сценария –

+0

Привет, Франклин, я добавил ссылку на проблемный проект в конце сообщения. Я не делал ничего особенного, чтобы отобразить кнопку «Назад», она должна быть автоматической из-за наличия стека навигации. –

ответ

0

Когда вы находитесь на странице «Сведения», кнопка «Назад» возвращает меня на страницу содержимого главного меню, а не на главную страницу, что было бы ожидаемым поведением в моих глазах. Каков предполагаемый способ достижения такого поведения?

Да, ваше предположение верно, это связано с отсутствием конкретной страницы в стеке навигации.

Поведение по умолчанию страницы мастера Хамарин по умолчанию не может выполнить ваше полное требование.

Правильный способ в этом случае - использовать Navigation.PushAsync. Этот метод асинхронно добавляет страницу в верхнюю часть стека навигации.

Вызов экземпляра страницы с деталями в событии ItemSelected вызывает освобождение, поскольку его свойство Parent уже установлено.

Похоже, вы assinged на Detail свойство 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 я думаю?). Я был в предположении, что MasterDetailPage привносит все эти особенности поведения мастера под одной и той же страницей, но похоже, что это вовсе не его цель. Так что же такое правильный сценарий использования MasterDetailPage, если не мой текущий? –

+1

По моему опыту, поведение MasterDetailPage немного похоже на [меню гамбургеров в UWP] (https://blogs.msdn.microsoft.com/quick_thoughts/2015/06/01/windows-10-splitview-build-your -first-hamburger-menu /), но с помощью элемента управления SplitView меню Hamburger поддерживает кнопку navi back в верхней строке заголовка. В Xamarin он не добавляет поддержку для этого сценария. Рекомендуемым шаблоном является UWP, шаблон Template10: https://github.com/Windows-XAML/Template10/wiki –

 Смежные вопросы

  • Нет связанных вопросов^_^