Xamarin.Forms MasterDetailPage отклоняет MasterPageItem

#c# #xamarin.forms

#c# #xamarin.forms

Вопрос:

У меня есть MasterDetailPage и у меня есть боковое меню? с помощью MasterPageItem. Теперь я пытаюсь отклонить представленный элемент MasterPageItem. Как мне это сделать?

Вот моя страница MasterDetailPage:

 <MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" 
                  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
                  xmlns:local="clr-namespace:MyApp;assembly=MyApp"
                  x:Class="MyApp.MainPage">
  <MasterDetailPage.Master>
    <local:MasterPage x:Name="masterPage" />
  </MasterDetailPage.Master>
    <MasterDetailPage.Detail>
        <NavigationPage>
            <x:Arguments>
                <local:HomePage />
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Detail>
</MasterDetailPage>
 

и метод onItemSelected:

 void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var item = e.SelectedItem as MasterPageItem;
            if (item != null)
            {

                if(item.Title == "Logout")
                {
                    SecureStorage.RemoveAll();
                    MessagingCenter.Send<Paindown.App>((Paindown.App)Xamarin.Forms.Application.Current, "UpdateMenu");
                    IsPresented = false;
                }
                else
                {
                    Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
                    masterPage.listView.SelectedItem = null;
                    IsPresented = false;
                }
            }
        }
 

Вот как я определяю страницу в моем боковом меню в MasterPage:

 menu.Add(new MasterPageItem
                {
                    Title = "Login",
                    TargetType = typeof(LoginPage)
                });
 

Мой вопрос от LoginPage, как мне вернуться на главную страницу?

Ответ №1:

Вы могли бы использовать MessageCenter для отправки сообщения со страницы входа в MenuPage, а затем сделать так, чтобы в MenuPage выбранный элемент был домашней страницей.

Например, отправить сообщение со страницы входа:

 void Button_Clicked(object sender, EventArgs e)
{
    //MenuItemType.HomePage is a int value to represent the HomePage
    MessagingCenter.Send<object, int>(this, "Home", (int)MenuItemType.HomePage);
}
 

Затем в MenuPage можно установить текущую страницу в качестве домашней страницы:

 public partial class MenuPage : ContentPage
{
    public MenuPage()
    {
       ...

       //ListViewMenu is the name of ListView in Slider menu
       //menuItems is the ViewModel which contains the HomePage

       MessagingCenter.Subscribe<object,int>(this, "Home", (senders,arg) =>
        {
            ListViewMenu.SelectedItem = menuItems[arg];
        });

       ...
    }

}  
 

================================= Обновление================================

Если для этого требуется исправление, вам нужно открыть меню слайдера и закрыть его вручную.

До этого мы могли бы создать public static Instance главную страницу (MasterDetailPage). Затем мы можем использовать его в MenuPage для использования IsPresented свойства.

Главная страница:

 public partial class MainPage : MasterDetailPage
{
  ...
  public static MainPage Instance { set; get; }

  ...

  public MainPage()
  {
   ...
   Instance = this;
   ..
  
  }
}
 

Затем MenuPage изменит предыдущий метод MessagingCenter.Subscribe следующим образом:

 ...
MessagingCenter.Subscribe<object,int>(this, "Home",async (senders,arg) =>
{
    // open slider menu
    MainPage.Instance.IsPresented = true;
    // set selected item
    ListViewMenu.SelectedItem = menuItems[arg];
    // wait 0.5 second
    await Task.Delay(500);
    //close slider menu
    MainPage.Instance.IsPresented = false;
});
...
 

Комментарии:

1. Да, вам нужно открыть меню слайдера и закрыть его вручную.

2. Могу ли я увидеть пример?

3. @user979331 Хорошо, я обновлю ответ.

4. @user979331 Я обновил его. Если ответ полезен, пожалуйста, не забудьте принять его в качестве ответа (нажмите ✔ в up.er левый угол этого ответа) и проголосуйте за него, это поможет другим, у кого есть подобная проблема.