private void AddFlyoutItem(ContentPage page, PageConfigAttribute flyoutItemAttribute)
        {
            ShellSection shellSection = new ShellSection
            {
                Title = flyoutItemAttribute.FlyoutName,
                Icon  = flyoutItemAttribute.FlyoutIcon,
            };

            shellSection.Items.Add(new ShellContent()
            {
                Content = page
            });
            _shellItems.Add(flyoutItemAttribute.FlyoutItemPosition, shellSection);
        }
        private void Initialize(Type page, Type viewModelType, PageConfigAttribute attribute, List <Type> pageControllers, int index)
        {
            ContentPage currPage = (BasePage)Activator.CreateInstance(page);

            currPage.Appearing += CurrPage_Appearing;
            var viewModel = (BaseViewModel)Activator.CreateInstance(viewModelType);

            viewModel.NavBarImage   = attribute.FlyoutIcon;
            viewModel.NavBarText    = attribute.FlyoutName;
            currPage.BindingContext = viewModel;
            try
            {
                var controller =
                    (IPageController)Activator.CreateInstance(pageControllers.ElementAt(index), currPage);
                _pageControllers.Add(controller);
                controller.ExecuteInitializeViewModel(viewModel);
                AddFlyoutItem(currPage, attribute);
            }
            catch (Exception)
            {
                Debug.WriteLine("Fail to add Page Controller");
            }
        }
        public void InitializePageSystem()
        {
            var assemblyTypes   = Assembly.GetExecutingAssembly().GetTypes();
            var pageControllers = assemblyTypes.Where(c => c.Name.Contains("Controller") &&
                                                      c.GetInterfaces().Any(i => i == typeof(IPageController))).ToList();

            for (int i = 0; i < pageControllers.Count(); i++)
            {
                Type page = assemblyTypes.FirstOrDefault(p => p.Namespace == pageControllers.ElementAt(i).Namespace &&
                                                         p.Name.Contains("Page") && p.BaseType == typeof(BasePage));
                PageConfigAttribute attribute = pageControllers.ElementAt(i).GetCustomAttribute <PageConfigAttribute>();
                if (attribute == null)
                {
                    attribute = new PageConfigAttribute("", "", 0);
                }
                Type viewModelType = assemblyTypes.FirstOrDefault(p => p.Namespace == pageControllers.ElementAt(i).Namespace &&
                                                                  p.Name.Contains("ViewModel") && p.BaseType == typeof(BaseViewModel));
                if (page != null && viewModelType != null)
                {
                    Initialize(page, viewModelType, attribute, pageControllers, i);
                }
            }
            AddFlyoutItemsToShell();
        }