internal static async void SetMasterLeftBarButton(UIViewController containerController, MasterDetailPage masterDetailPage) { if (!masterDetailPage.ShouldShowToolbarButton()) { containerController.NavigationItem.LeftBarButtonItem = null; return; } EventHandler handler = (o, e) => masterDetailPage.IsPresented = !masterDetailPage.IsPresented; bool shouldUseIcon = masterDetailPage.Master.Icon != null; if (shouldUseIcon) { try { var source = Internals.Registrar.Registered.GetHandler <IImageSourceHandler>(masterDetailPage.Master.Icon.GetType()); var icon = await source.LoadImageAsync(masterDetailPage.Master.Icon); containerController.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(icon, UIBarButtonItemStyle.Plain, handler); } catch (Exception) { // Throws Exception otherwise would catch more specific exception type shouldUseIcon = false; } } if (!shouldUseIcon) { containerController.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(masterDetailPage.Master.Title, UIBarButtonItemStyle.Plain, handler); } }
internal static void SetMasterLeftBarButton(UIViewController containerController, MasterDetailPage masterDetailPage) { if (!masterDetailPage.ShouldShowToolbarButton()) { containerController.NavigationItem.LeftBarButtonItem = null; return; } EventHandler handler = (o, e) => masterDetailPage.IsPresented = !masterDetailPage.IsPresented; bool shouldUseIcon = masterDetailPage.Master.Icon != null; if (shouldUseIcon) { try { containerController.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(new UIImage(masterDetailPage.Master.Icon), UIBarButtonItemStyle.Plain, handler); } catch (Exception) { // Throws Exception otherwise would catch more specific exception type shouldUseIcon = false; } } if (!shouldUseIcon) { containerController.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(masterDetailPage.Master.Title, UIBarButtonItemStyle.Plain, handler); } }
void UpdateLeftBarButtonItem(ParentingViewController containerController, Page pageBeingRemoved = null) { if (containerController == null) { return; } var currentChild = containerController.Child; var firstPage = ((INavigationPageController)Element).Pages.FirstOrDefault(); if ((firstPage != pageBeingRemoved && currentChild != firstPage && NavigationPage.GetHasBackButton(currentChild)) || _parentMasterDetailPage == null) { return; } if (!_parentMasterDetailPage.ShouldShowToolbarButton()) { containerController.NavigationItem.LeftBarButtonItem = null; return; } var shouldUseIcon = _parentMasterDetailPage.Master.Icon != null; if (shouldUseIcon) { try { containerController.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(new UIImage(_parentMasterDetailPage.Master.Icon), UIBarButtonItemStyle.Plain, (o, e) => _parentMasterDetailPage.IsPresented = !_parentMasterDetailPage.IsPresented); } catch (Exception) { // Throws Exception otherwise would catch more specific exception type shouldUseIcon = false; } } if (!shouldUseIcon) { containerController.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(_parentMasterDetailPage.Master.Title, UIBarButtonItemStyle.Plain, (o, e) => _parentMasterDetailPage.IsPresented = !_parentMasterDetailPage.IsPresented); } }
void UpdateToolbarItems() { if (_page.ApplicationBar == null) { _page.ApplicationBar = new ApplicationBar(); } ToolbarItem[] items = _tracker.ToolbarItems.ToArray(); MasterDetailPage masterDetail = _tracker.Target.Descendants().Prepend(_tracker.Target).OfType <MasterDetailPage>().FirstOrDefault(); TaggedAppBarButton oldMasterDetailButton = _page.ApplicationBar.Buttons.OfType <TaggedAppBarButton>().FirstOrDefault(b => b.Tag is MasterDetailPage && b.Tag != masterDetail); if (oldMasterDetailButton != null) { _page.ApplicationBar.Buttons.Remove(oldMasterDetailButton); } if (masterDetail != null) { if (masterDetail.ShouldShowToolbarButton()) { if (_page.ApplicationBar.Buttons.OfType <TaggedAppBarButton>().All(b => b.Tag != masterDetail)) { var button = new TaggedAppBarButton { IconUri = new Uri(masterDetail.Master.Icon ?? "ApplicationIcon.jpg", UriKind.Relative), Text = masterDetail.Master.Title, IsEnabled = true, Tag = masterDetail }; button.Click += (sender, args) => { var masterDetailRenderer = GetRenderer(masterDetail) as MasterDetailRenderer; if (masterDetailRenderer != null) { masterDetailRenderer.Toggle(); } }; _page.ApplicationBar.Buttons.Add(button); } } } var buttonsToAdd = new List <TaggedAppBarButton>(); foreach (ToolbarItem item in items.Where(i => i.Order != ToolbarItemOrder.Secondary)) { IMenuItemController controller = item; if (_page.ApplicationBar.Buttons.OfType <TaggedAppBarButton>().Any(b => b.Tag == item)) { continue; } var button = new TaggedAppBarButton { IconUri = new Uri(item.Icon ?? "ApplicationIcon.jpg", UriKind.Relative), Text = !string.IsNullOrWhiteSpace(item.Text) ? item.Text : (string)item.Icon ?? "ApplicationIcon.jpg", IsEnabled = controller.IsEnabled, Tag = item }; button.Click += (sender, args) => controller.Activate(); buttonsToAdd.Add(button); } var menuItemsToAdd = new List <TaggedAppBarMenuItem>(); foreach (ToolbarItem item in items.Where(i => i.Order == ToolbarItemOrder.Secondary)) { if (_page.ApplicationBar.MenuItems.OfType <TaggedAppBarMenuItem>().Any(b => b.Tag == item)) { continue; } var button = new TaggedAppBarMenuItem { Text = !string.IsNullOrWhiteSpace(item.Text) ? item.Text : (string)item.Icon ?? "MenuItem", IsEnabled = true, Tag = item }; button.Click += (sender, args) => ((IMenuItemController)item).Activate(); menuItemsToAdd.Add(button); } TaggedAppBarButton[] deadButtons = _page.ApplicationBar.Buttons.OfType <TaggedAppBarButton>().Where(b => b.Tag is ToolbarItem && !items.Contains(b.Tag)).ToArray(); TaggedAppBarMenuItem[] deadMenuItems = _page.ApplicationBar.MenuItems.OfType <TaggedAppBarMenuItem>().Where(b => b.Tag is ToolbarItem && !items.Contains(b.Tag)).ToArray(); // we must remove the dead buttons before adding the new ones so we don't accidentally go over the limit during the transition foreach (TaggedAppBarButton deadButton in deadButtons) { deadButton.Dispose(); _page.ApplicationBar.Buttons.Remove(deadButton); } foreach (TaggedAppBarMenuItem deadMenuItem in deadMenuItems) { _page.ApplicationBar.MenuItems.Remove(deadMenuItem); } // fixme, insert in order foreach (TaggedAppBarButton newButton in buttonsToAdd) { _page.ApplicationBar.Buttons.Add(newButton); } foreach (TaggedAppBarMenuItem newMenuItem in menuItemsToAdd) { _page.ApplicationBar.MenuItems.Add(newMenuItem); } _page.ApplicationBar.IsVisible = _page.ApplicationBar.Buttons.Count > 0 || _page.ApplicationBar.MenuItems.Count > 0; }