private void AddItemToMenu(ToolbarItemWrapper item) { if (item.Item is ToolbarPicker) { var pickerItem = (ToolbarPicker)item.Item; var menuItem = new MenuFlyoutSubItem(); menuItem.DataContext = item; menuItem.Text = item.Item.Title; foreach (var toolbarSubItem in ((ToolbarPicker)item.Item).Items) { var menuSubItem = new ToggleMenuFlyoutItem(); menuSubItem.DataContext = toolbarSubItem; menuSubItem.Text = toolbarSubItem.Title; menuSubItem.Click += MenuSubItem_Click; menuSubItem.IsChecked = toolbarSubItem == pickerItem.SelectedItem; menuItem.Items.Add(menuSubItem); } MenuFlyout.Items.Add(menuItem); } else { var menuItem = new MenuFlyoutItem(); menuItem.DataContext = item; menuItem.Text = item.Item.Title; menuItem.Command = ((ToolbarButton)item.Item).Command; MenuFlyout.Items.Add(menuItem); } MenuButton.Opacity = 1; }
private void UpdateItems() { var totalItemsWidth = ItemsPanel.Children.OfType <ContentControl>().Sum(c => c.ActualWidth); if (totalItemsWidth > this.ActualWidth - MenuButton.ActualWidth) { int i = ItemsPanel.Children.Count - 1; while (i >= 0) { var control = (ContentControl)ItemsPanel.Children[i]; var position = control.TransformToVisual(ItemsPanel).TransformPoint(new Point()); if (position.X + control.ActualWidth < this.ActualWidth - MenuButton.ActualWidth) { break; } else { var item = (ToolbarItem)control.Content; var itemWrapper = new ToolbarItemWrapper() { ActualWidth = control.ActualWidth, Item = item }; control.ContentTemplate = null; //doesn't remove correctly without this ItemsPanel.Children.Remove(control); AddItemToMenu(itemWrapper); } i--; } } else { int i = MenuFlyout.Items.Count - 1; while (i >= 0) { var menuItem = MenuFlyout.Items[i]; var itemWrapper = (ToolbarItemWrapper)menuItem.DataContext; if (totalItemsWidth + itemWrapper.ActualWidth <= this.ActualWidth - MenuButton.ActualWidth) { RemoveItemFromMenu(itemWrapper); AddItemToPanel(itemWrapper.Item); totalItemsWidth += itemWrapper.ActualWidth; } else { break; } i--; } } }
private void RemoveItemFromMenu(ToolbarItemWrapper item) { var menuItem = MenuFlyout.Items.FirstOrDefault(i => i.DataContext == item); if (menuItem is MenuFlyoutSubItem) { foreach (MenuFlyoutItem menuSubItem in ((MenuFlyoutSubItem)menuItem).Items) { menuSubItem.Click -= MenuSubItem_Click; } } MenuFlyout.Items.Remove(menuItem); if (MenuFlyout.Items.Count > 0) { MenuButton.Opacity = 1; } else { MenuButton.Opacity = 0; } }