Метод OnApearing() не срабатывает второй раз на странице сведений о Mater в формах xamarin

Я использую пользовательскую главную страницу сведений. На этой странице я реализовал метод onAppearing(). Он запускается только в первый раз (когда я запускаю программу. Основная страница сведений является корневой страницей моего приложения). Когда я щелкнул значок гамбургера, чтобы открыть ящик навигации, этот OnAppearing() не срабатывает.

Код MasterDetailsPage CS:

public partial class MainMasterDetailPage : MasterDetailPage
    {
        public MainMasterDetailPage()
        {
            InitializeComponent();
            
            NavigationPage.SetHasBackButton(this, false);
            NavigationPage.SetHasNavigationBar(this, false);
           
            ListOfSettings.IsVisible = false;

            this.IsPresented = false;

            Detail = new NavigationPage(new DashboardTabbedPage());

        }
        protected override async void OnAppearing()
        {
            base.OnAppearing();
            ListOfSettings.IsVisible = false;
        }
}

введите здесь описание изображения введите здесь описание изображения


person Priyanka    schedule 12.02.2020    source источник
comment
Он срабатывает, когда вы сворачиваете приложение, а затем разворачиваете его? Он не сработает, когда вы нажмете меню, потому что этот элемент управления уже присутствует. Также не используйте асинхронный метод в OnAppearing, если вы не вызываете асинхронную функцию внутри.   -  person Adlorem    schedule 12.02.2020
comment
Я хочу установить false для свойства Isvisible для одного макета стека... Что мне для этого нужно сделать.   -  person Priyanka    schedule 12.02.2020
comment
Для макета стека внутри страницы меню?   -  person Adlorem    schedule 12.02.2020
comment
Да... См. фото выше один раз. Экран по умолчанию будет отображаться как первый снимок экрана. Когда я нажимаю кнопку settings, открываются подкнопки. Если я закрою этот экран, не закрывая вспомогательные кнопки, они будут видны, когда я открою панель навигации.   -  person Priyanka    schedule 12.02.2020
comment
Очевидно, что он не сработает, потому что он не появляется логически, он всегда просто там. Теперь, чтобы обновить меню гамбургеров @ Runtime, вам придется использовать центр обмена сообщениями, прослушать сообщение и обновить данные соответственно heartbeat.fritz.ai/xamarin-forms-messagingcenter-ab97eb923fd0   -  person FreakyAli    schedule 12.02.2020
comment
Как я могу использовать MessagingCenter в этом случае?   -  person Priyanka    schedule 12.02.2020
comment
Вы знаете, как работает центр обмена сообщениями?   -  person FreakyAli    schedule 12.02.2020
comment
@FreakyAli Я использовал свойство IsPresentedChanged. Пожалуйста, проверьте приведенный ниже код.   -  person Priyanka    schedule 12.02.2020


Ответы (2)


Самый простой способ справиться с этим, за исключением центра обмена сообщениями (который может быть сложным при передаче логического значения), — это подписаться на обработчик событий IsPresentedChanged вашей основной страницы сведений на странице меню. Пример псевдокода:

namespace TestApp.Views
{
    public partial class MenuPage : ContentPage
    {
        MainPage RootPage { get => Application.Current.MainPage as MainPage; }
        List<HomeMenuItem> menuItems;
        public MenuPage()
        {
            InitializeComponent();

            BindingContext = this;

            menuItems = new List<HomeMenuItem>
            {
                new HomeMenuItem {Id = MenuItemType.Browse, Title="Browse" },
                new HomeMenuItem {Id = MenuItemType.About, Title="About" }
            };




            ListViewMenu.ItemsSource = menuItems;

            ListViewMenu.SelectedItem = menuItems[0];
            ListViewMenu.ItemSelected += async (sender, e) =>
            {
                if (e.SelectedItem == null)
                    return;

                var id = (int)((HomeMenuItem)e.SelectedItem).Id;
                RootPage.IsPresentedChanged += MenuVisibleChanged;
                await RootPage.NavigateFromMenu(id);

            };


        }

        private void MenuVisibleChanged(object sender, EventArgs e)
        {
            //handle your menu visibilty here with calling IsPresented
            var menuIsVisible = RootPage.IsPresented;
        }
    }
}
person Adlorem    schedule 12.02.2020

Я использовал свойство IsPresentedChanged. Пожалуйста, проверьте приведенный ниже код.

public MainMasterDetailPage()
        {
            InitializeComponent();

            NavigationPage.SetHasBackButton(this, false);
            NavigationPage.SetHasNavigationBar(this, false);
            ListOfSettings.IsVisible = false;
            this.IsPresented = false;
            Detail = new NavigationPage(new DashboardTabbedPage());

            this.IsPresentedChanged += hideSettingMenu;

        }
        public void hideSettingMenu(object sender, EventArgs args)
        {
            ListOfSettings.IsVisible = false;
        }
person Priyanka    schedule 12.02.2020